• Objective-C 与JAVA的SHA1/HmacSHA1加密算法实现


    最近研究IOS手机上登录的功能。由于加密方式使用SHA1算法。网上也没找到直接的例子,最终参照StackoverFlow上的大神,完成了加密实现。

    先上代码:

    [objc] view plain copy
     
    1. //HmacSHA1加密;  
    2. +(NSString *)HmacSha1:(NSString *)key data:(NSString *)data  
    3. {  
    4.     const charchar *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];  
    5.     const charchar *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];  
    6.     //Sha256:  
    7.     // unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];  
    8.     //CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);  
    9.       
    10.     //sha1  
    11.     unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];  
    12.     CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);  
    13.   
    14.     NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC  
    15.                                           length:sizeof(cHMAC)];  
    16.       
    17.     NSString *hash = [HMAC base64EncodedStringWithOptions:0];//将加密结果进行一次BASE64编码。  
    18.     return hash;  
    19. }  
    20.   
    21. //密码加密方式:SHA1  
    22. +(NSString *)EncriptPassword_SHA1:(NSString *)password{  
    23.     const charchar *cstr = [password cStringUsingEncoding:NSUTF8StringEncoding];  
    24.     NSData *data = [NSData dataWithBytes:cstr length:password.length];  
    25.     uint8_t digest[CC_SHA1_DIGEST_LENGTH];  
    26.     CC_SHA1(data.bytes, data.length, digest);  
    27.       
    28.     NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH *2];  
    29.       
    30.     for(int i =0; i < CC_SHA1_DIGEST_LENGTH; i++) {  
    31.         [result appendFormat:@"%02x", digest[i]];  
    32.     }  
    33.       
    34.     return [result uppercaseString];  
    35. }  

    由于Android版本也用到,附上JAVA版本代码:

    1.HmacSHA1:

    [java] view plain copy
     
    1. SecretKeySpec localSecretKeySpec = new SecretKeySpec(mySecretKey.getBytes("UTF-8"), "HmacSHA1");//加密密钥  
    2. Mac localMac = Mac.getInstance("HmacSHA1");  
    3. localMac.init(localSecretKeySpec);  
    4. localMac.update(myDate.getBytes("UTF-8"));//加密内容,这里使用时间  
    5. String result = Base64.encodeToString(localMac.doFinal(), 0).trim(); //获取加密结果并转BASE64  

    2:直接SHA1

    [java] view plain copy
     
      1. public static String authPassword(String paramString)  
      2. {  
      3. try  
      4.   {  
      5.     MessageDigest localMessageDigest = MessageDigest.getInstance("SHA1");  
      6.     localMessageDigest.update(paramString.getBytes());  
      7.     String str = bytes2Hex(localMessageDigest.digest()).toUpperCase();  
      8. return str;  
      9.   }  
      10. catch (NoSuchAlgorithmException localNoSuchAlgorithmException)  
      11.   {  
      12.   }  
      13. return "";  }  
     1 public static String bytes2Hex(byte[] src) {
     2 
     3   StringBuilder stringBuilder = new StringBuilder("");
     4   if (src == null || src.length <= 0) {
     5    return null;
     6   }
     7   for (int i = 0; i < src.length; i++) {
     8    int v = src[i] & 0xFF;
     9    String hv = Integer.toHexString(v);
    10    if (hv.length() < 2) {
    11     stringBuilder.append(0);
    12    }
    13    stringBuilder.append(hv);
    14   }
    15   return stringBuilder.toString();
    16  }

     

  • 相关阅读:
    Linux文件系统之INode
    手写Netty之多路复用Select小案例
    多路复用器Select、Poll、Epoll区别梳理
    NAT模式、路由模式、桥接模式的区别
    Netty编解码器(理论部分)
    Netty之Unpooled_Bytebuf
    为什么 TCP 协议有粘包问题
    IDEA_2019.1版本中Protobuf的使用
    Netty服务端Server代码说明
    Netty之ChannelHandler
  • 原文地址:https://www.cnblogs.com/dongweiq/p/7592460.html
Copyright © 2020-2023  润新知