1. 程式人生 > >Objective-C 與JAVA的SHA1/HmacSHA1加密演算法實現

Objective-C 與JAVA的SHA1/HmacSHA1加密演算法實現

最近研究IOS手機上登入的功能。由於加密方式使用SHA1演算法。網上也沒找到直接的例子,最終參照StackoverFlow上的大神,完成了加密實現。

先上程式碼:

//HmacSHA1加密;
+(NSString *)HmacSha1:(NSString *)key data:(NSString *)data
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
    //Sha256:
    // unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    //CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    
    //sha1
    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                          length:sizeof(cHMAC)];
    
    NSString *hash = [HMAC base64EncodedStringWithOptions:0];//將加密結果進行一次BASE64編碼。
    return hash;
}

//密碼加密方式:SHA1
+(NSString *)EncriptPassword_SHA1:(NSString *)password{
    const char *cstr = [password cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:password.length];
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, data.length, digest);
    
    NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH *2];
    
    for(int i =0; i < CC_SHA1_DIGEST_LENGTH; i++) {
        [result appendFormat:@"%02x", digest[i]];
    }
    
    return [result uppercaseString];
}

由於Android版本也用到,附上JAVA版本程式碼:

1.HmacSHA1:

 SecretKeySpec localSecretKeySpec = new SecretKeySpec(mySecretKey.getBytes("UTF-8"), "HmacSHA1");//加密金鑰
 Mac localMac = Mac.getInstance("HmacSHA1");
 localMac.init(localSecretKeySpec);
 localMac.update(myDate.getBytes("UTF-8"));//加密內容,這裡使用時間
 String result = Base64.encodeToString(localMac.doFinal(), 0).trim(); //獲取加密結果並轉BASE64
2:直接SHA1
         public static String authPassword(String paramString)
	  {
	    try
	    {
	      MessageDigest localMessageDigest = MessageDigest.getInstance("SHA1");
	      localMessageDigest.update(paramString.getBytes());
	      String str = bytes2Hex(localMessageDigest.digest()).toUpperCase();
	      return str;
	    }
	    catch (NoSuchAlgorithmException localNoSuchAlgorithmException)
	    {
	    }
	    return "";
	  }

	  public static String bytes2Hex(byte[] paramArrayOfByte)
	  {
	    String str1 = "";
	    for (int i = 0; ; i++)
	    {
	      if (i >= paramArrayOfByte.length)
	        return str1;
	      String str2 = Integer.toHexString(0xFF & paramArrayOfByte[i]);
	      if (str2.length() == 1)
	        str1 = str1 + "0";
	      str1 = str1 + str2;
	    }
	  }