2016-08-11 3 views
1

я разрабатывал сервер с Node.js и клиента с каркасом Ионныепочему шифрует результат отличается использованием алгоритма AES же и тот же ключ между CryptoJS и узлом встроенным криптографическим модулем

Я сделал API для запроса авторизации от клиента

когда запрос клиента Логин, посылает зашифрованный идентификатор и пароль строку

и сервер расшифровывать принятый идентификатор и пароль строку и проверить проверки

Я использовал криптографию-JS (https://code.google.com/archive/p/crypto-js/) Lib окон- чательно для шифрования клиента

код шифрования клиента ниже

var secret = 'abcdefghijklmnopqrstuvwxyz123456'; 
var id = "someId"; 
var encrypted = CryptoJS.AES.encrypt(id, password); 
console.log(encrypted.toString()); // U2FsdGVkX19EfjjBwydSZL509wKl5TEX+4f3vakEejU= 

Для серверного дешифрования я использовал узел встроенный криптографической модуль

const crypto = require('crypto'); 
var method = 'aes256'; 
var secret = 'abcdefghijklmnopqrstuvwxyz123456'; 
var id = "U2FsdGVkX19EfjjBwydSZL509wKl5TEX+4f3vakEejU=" // suppose we received with no loss 
var decipher = crypto.createDecipher(method, secret); 
decipher.update(id,'base64','utf8'); 
var deciphered = decipher.final('utf8'); 
console.log(deciphered); 

аварии на стороне сервера код расшифровывают с сообщением об ошибке ниже

crypto.js:153 
    var ret = this._handle.final(); 
         ^

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt 
    at Error (native) 
    at Decipher.Cipher.final (crypto.js:153:26) 
    at Object.<anonymous> (...\routes\index.js:33:27) 
    at Module._compile (module.js:409:26) 
    at Object.Module._extensions..js (module.js:416:10) 
    at Module.load (module.js:343:32) 
    at Function.Module._load (module.js:300:12) 
    at Module.require (module.js:353:17) 
    at require (internal/module.js:12:17) 
    at Object.<anonymous> (...\app.js:18:14) 
    at Module._compile (module.js:409:26) 
    at Object.Module._extensions..js (module.js:416:10) 
    at Module.load (module.js:343:32) 
    at Function.Module._load (module.js:300:12) 
    at Module.require (module.js:353:17) 
    at require (internal/module.js:12:17) 

Поскольку сообщение об ошибке было «плохой дешифровкой», поэтому я попытался зашифровать такие же текст с каждой библиотеки

[крипто-УД]

var secret = 'abcdefghijklmnopqrstuvwxyz123456'; 
var id = "someId"; 
var encrypted = CryptoJS.AES.encrypt(id, password); 
console.log(encrypted.toString()); // U2FsdGVkX19EfjjBwydSZL509wKl5TEX+4f3vakEejU= 

[криптографический модуль]

const crypto = require('crypto'); 
var method = 'aes256'; 
var secret = 'abcdefghijklmnopqrstuvwxyz123456'; 
var id = "someId" 
var cipher= crypto.createCipher(method, secret); 
cipher.update(id,'base64','utf8'); 
var ciphered = decipher.final('utf8'); 
console.log(ciphered.toString()); // WAsd61C2bfG7UbO5STo13A== 

Я узнал результат библиотеки отличается

plain text : 'someId' 
crpyto-js : 'U2FsdGVkX19EfjjBwydSZL509wKl5TEX+4f3vakEejU=' 
crpyto module : 'WAsd61C2bfG7UbO5STo13A==' 

Я пытался понять, исходный код каждой библиотеки

, но это было слишком усложнять так, я не мог понять,

Я хочу знать, как encrytion работы каждой библиотеки и то, что вызывает другой результат

+0

Эти два ответа моей стороны обрабатывают оба направления: [CryptoJS to node.js] (http://stackoverflow.com/a/28361216/1816580) и [node.js to CryptoJS] (http://stackoverflow.com/a/33942660/1816580) –

+0

вы не используете действительный ключ AES, поэтому обе системы пытаются сделать его правильной длиной, по-видимому, с разными стратегиями. – dandavis

+0

@ dandavis Вот в чем разница. Оба не используют какой-либо ключ, но предполагают, что прошедший «ключ» является паролем, а затем выводит фактический ключ из пароля. Единственное различие заключается в том, что CryptoJS использует случайную соль, а node.js - нет. Вот что говорит мой ответ за моей первой ссылкой. К сожалению, я не могу предложить дубликат. –

ответ

0

Вы используете две разные системы, которые могут иметь различные значения по умолчанию. Не полагайтесь на значения по умолчанию, но явно указывайте, что все будет одинаковым с обеих сторон. Crypto предназначен для отказа, если даже самая маленькая вещь не соответствует. Вам нужно будет указать используемое отображение символов в байтах, крипторежим, IV (если необходимо), ключ и метод заполнения.

Ваши разные выходы различной длины, поэтому изначально я подозреваю, что прокладка - это первое, на что нужно обратить внимание. Установите обе стороны в дополнение к PKCS # 7 и посмотрите, поможет ли это.

Для дальнейшей диагностики убедитесь, что ключ и IV являются байт-байт одинаковые с каждой стороны.

0

Все параметры должны быть указаны и указаны правильно. Не полагайтесь на значения по умолчанию, они зависят от реализации и очень сильно зависят от реализаций.

В общем, вы должны использовать:

  1. режим CBC со случайным внутривенно, при шифровании создать случайную в.в., перед именем его к зашифрованным данным для использования в расшифровке. Для AES значение iv должно быть 16-байтным, размер блока. Не используйте режим ECB, он небезопасен, см. ECB mode, прокрутите вниз до пингвина.

  2. PKCS # 7 padding (иногда называемый PKCS # 5). Это необходимо, потому что AES является блочным шифрованием, а вход и выход должны быть точным кратным размеру блока. Это дополнение будет автоматически добавлено во время шифрования и удалено во время дешифрования.

  3. Убедитесь, что iv и ключ точно.

  4. Для отладки отображения всех входов и выходов в шестнадцатеричном формате. Во время отладки может оказаться полезным сбрасывать все входы и выходы непосредственно перед и после шифрования и дешифрования. Hexadecimal позволяет видеть каждый байт, Base64 объединяет 3 байта в 4 байта и затрудняет понимание.

Когда все это будет точно таким же, выходы также будут точно такими же.

 Смежные вопросы

  • Нет связанных вопросов^_^