Хеширование PBKDF2 в javascript и iOS, генерирующее разные ключи

Это вопрос, связанный с сообщением: https://groups.google.com/forum/#!topic/crypto-js/t_HeWo5QhLk

Я попытался решить проблему, упомянутую в сообщении, но до сих пор не могу понять проблему с моим кодом:

используя 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 в iOS:

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.

Может ли кто-нибудь указать, что не так с этим кодом?

Спасибо!


person coder_andy    schedule 23.02.2015    source источник


Ответы (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 для документации. Возможно, вам придется включить другой файл сценария, чтобы этот выходной формат был доступен)

person Ian Clelland    schedule 23.02.2015
comment
Спасибо @Ian за ответ. Итак, как лучше всего сравнить два хэша? Мне нужно отправить хэш, сгенерированный в js, на сервер iOS и сравнить там два значения. - person coder_andy; 23.02.2015
comment
Из документов CryptoJS я бы предложил использовать key.toString(CryptoJS.enc.Base64) -- см. скрипку jsfiddle.net/t1tb9jad. - person Ian Clelland; 23.02.2015