2

CryptoJS 和 iOS 中的 PBKDF2 结果不同。

这是我的代码

CryptoJS

var key= CryptoJS.PBKDF2("gf8uny", "2mnfpLsa+5I=", { keySize: 256/32, iterations: 1000 });
console.log(key.toString(CryptoJS.enc.Base64));
// console output ANepH98DqZHtMkkVrIk/CNmfykVPfEFpoax2PF8z5k8=  

iOS

NSMutableData *key = [NSMutableData dataWithLength:kCCKeySizeAES256];

NSString *password = @"gf8uny";
NSData*salt =[NSData dataFromBase64String:@"2mnfpLsa+5I="];

int result = CCKeyDerivationPBKDF(kCCPBKDF2,         // algorithm
                                  password.UTF8String,                // password
                                  password.length,                    // passwordLength
                                  salt.bytes,                         // salt
                                  salt.length,                        // saltLen
                                  kCCPRFHmacAlgSHA1,                              // PRF
                                  1000,                 // rounds
                                  key.mutableBytes,            // derivedKey
                                  key.length);                 // derivedKeyLen

NSString *sKey= [key base64EncodedString];
NSLog(@"key%@", sKey);
// output AjHjVAwHCpF1SnNDN6ri9ms7ig88VFBPwRVRMppBgnU=

有人可以帮忙吗?我做错了什么?

谢谢

4

1 回答 1

0

在您的代码的 javascript 版本中,盐应该是 WordArray 对象而不是 javascript 字符串。基本上在你的两个例子中,盐是不同的,因此你得到了两个不同的结果。

要验证我在说什么,请在浏览器 javascript 控制台中尝试以下代码:

saltWArray = CryptoJS.lib.WordArray.random(128/8);
saltString = saltWArray.toString(); // same salt but in String format

var key1 = CryptoJS.PBKDF2("password", saltWArray, { keySize: 512/32, iterations: 300 });
var key2 = CryptoJS.PBKDF2("password", saltString, { keySize: 512/32, iterations: 300 });

在上面的代码中,key1 和 key2 会有所不同,因为即使盐含量相同,盐也存在本质上的不同。

于 2013-10-18T20:36:08.183 回答