2015-02-23 105 views
0

這個散列是與後一個問題:https://groups.google.com/forum/#!topic/crypto-js/t_HeWo5QhLkPBKDF2在javascript和iOS生成不同的密鑰

我試圖在帖子中提到的解決方案,但仍無法與我的代碼找出問題:

在IOS使用Crypto.js

var key= CryptoJS.PBKDF2("gf8uny", "2mnfpLsa+5I=", { keySize: 256/32, iterations: 1000 }); 
console.log(key.toString()); 
console.log(btoa(key.toString())); 
//OUTPUT: MDBkN2E5MWZkZjAzYTk5MWVkMzI0OTE1YWM4OTNmMDhkOTlmY2E0NTRmN2M0MTY5YTFhYzc2M2M1ZjMzZTY0Zg== 

使用CommonCrypto:

NSMutableData *webKey = [NSMutableData dataWithLength:64]; 
NSData *salt = [@"2mnfpLsa+5I=" dataUsingEncoding:NSUTF8StringEncoding]; 
NSString* password = @"gf8uny"; 
CCKeyDerivationPBKDF(kCCPBKDF2, password.UTF8String, password.length, salt.bytes,salt.length, kCCPRFHmacAlgSHA1, 1000, webKey.mutableBytes, webKey.length); 

NSString* skey = [webKey base64EncodedStringWithOptions:0]; 
NSLog(@"key %@",skey); 
//OUTPUT: ANepH98DqZHtMkkVrIk/CNmfykVPfEFpoax2PF8z5k+jrwa0yTNt0tQedQ4bxqV/T0gXbsyKHiVx8DuJdlkufA== 

這兩個代碼中的輸出字符串都是base64編碼的。

任何人都可以指出這段代碼有什麼問題嗎?

謝謝!

回答

1

輸出看起來不同的原因是Base64的輸入是不同的;其中的原因是,在JavsScript代碼,你叫

key.toString() 

因此,在JavaScript中,你有base64編碼的64個字符的字符串

"00d7a91fdf03a991ed324915ac893f08d99fca454f7c4169a1ac763c5f33e64f" 

與JN的Objective-C,你有base64編碼的原始32字節序列

0x00 0xd7 0xa9 0x1f 0xdf ... 0xe6 0x4f 

在這兩種情況下,你的PBKDF2代碼已經拿出了相同的密鑰。在每種情況下,您都只是對密鑰進行了不同編碼。

你可以得到CryptoJS通過直接序列化的關鍵,像這樣來創建相同的Base64輸出:

key.toString(CryptoJS.enc.Base64) 

(用於文檔見https://code.google.com/p/crypto-js/#The_Hasher_Output您可能必須包括對這個輸出格式到另一個腳本文件。可用)

+0

謝謝@Ian的答案。那麼,比較兩個哈希值的最佳方法是什麼?我需要將js中生成的哈希值發送給iOS服務器,並在那裏比較兩個值。 – 2015-02-23 20:01:04

+0

從CryptoJS文檔,我會建議使用'key.toString(CryptoJS.enc.Base64)' - 請參閱小提琴http://jsfiddle.net/t1tb9jad/ – 2015-02-23 20:45:42

+0

謝謝伊恩,這工作。 – 2015-02-24 00:54:24