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  }

 

原文地址:https://www.cnblogs.com/dongweiq/p/7592460.html