javascript和iOS中生成不同密钥的PBKDF2哈希

javascript和iOS中生成不同密钥的PBKDF2哈希,javascript,ios,cryptojs,pbkdf2,Javascript,Ios,Cryptojs,Pbkdf2,这是一个与该职位相关的问题: 我已经尝试了文章中提到的解决方案,但仍然无法解决代码的问题: 使用Crypto.js var key= CryptoJS.PBKDF2("gf8uny", "2mnfpLsa+5I=", { keySize: 256/32, iterations: 1000 }); console.log(key.toString()); console.log(btoa(key.toString())); //OUTPUT: MDBkN2E5MWZkZjAzYTk5MWVkMzI

这是一个与该职位相关的问题:

我已经尝试了文章中提到的解决方案,但仍然无法解决代码的问题:

使用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==
在iOS中使用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编码的

有人能指出这个代码的错误吗


谢谢

输出看起来不同的原因是Base64的输入不同;原因是在JavsScript代码中,您调用了

key.toString()
因此,在JavaScript中,您对64个字符串进行了base64编码

"00d7a91fdf03a991ed324915ac893f08d99fca454f7c4169a1ac763c5f33e64f"
在jn Objective-C中,您已经对原始32字节序列进行了base64编码

0x00 0xd7 0xa9 0x1f 0xdf ... 0xe6 0x4f
在这两种情况下,您的PBKDF2代码都使用相同的密钥。您只是在每种情况下对密钥进行了不同的编码

通过直接序列化密钥,可以让CryptoJS创建相同的Base64输出,如下所示:

key.toString(CryptoJS.enc.Base64)

(有关文档,请参阅。要获得此输出格式,您可能需要包含另一个脚本文件)

谢谢@Ian的回答。那么,比较这两个散列的最佳方法是什么?我需要将js中生成的哈希发送到iOS服务器,并比较其中的两个值。从CryptoJS文档中,我建议使用
key.toString(CryptoJS.enc.Base64)
——请参阅fiddle