2013-03-21 6 views
2

У меня есть проблема с использованием AES расшифровать для объекта буфера и я надеюсь, что кто-то есть идея, что я делаю неправильно ...расшифровывать MySQL в Node.js

MyExample: У меня есть таблица MySQL с AES_ENCRYPT для имени пользователя и пароля ...

CREATE TABLE Accounts 
(
    id INT(4) NOT NULL AUTO_INCREMENT, 
    username VARBINARY(128) NOT NULL, 
    password VARBINARY(128) NOT NULL, 
    PRIMARY KEY(id) 
); 

DELIMITER | 
CREATE TRIGGER encodeAccounts BEFORE INSERT ON Accounts 
FOR EACH ROW BEGIN 
    SET NEW.username = AES_ENCRYPT(NEW.username, 'password'); 
    SET NEW.password = AES_ENCRYPT(NEW.password, 'password'); 
END; 

Node.js: Я с помощью модуля узла-MySQL, чтобы отправить запрос на мой datase:

SELECT * FROM Accounts; 

Такого рода ценностей возвращаются на пароль и имя пользователя:

<Buffer 07 86 95 ee 77 df 86 50 ae 18 4c d5 3e 48 42 75> 

Как расшифровать его с Node.js расшифровать метод? Мои попытки не удалось все ... Я надеюсь, что AES-128-ECB правильно выбран ...

Чтобы deciper что-то в Node.js должен выглядеть следующим образом:

var decipher = crypto.createDecipher('AES-128-ECB', 'password'); 
var dec = decipher.update(rows[i].username); // an example, value look like <Buffer ... 
dec += decipher.final('utf8'); 
console.log('dec: ' + dec); 

Спасибо всем помогает :)

+0

Он не похож это будет легко, см. [эту страницу] (http://coding.smashingmagazine.com/2012/05/20/replicating-mysql-aes-encryption-methods-with-php/) о том, как реализовать метод MySQL для расширение ключа и paddi нг. Вы не можете использовать 'AES_DECRYPT' внутри запроса? – robertklep

+0

@robertklep, конечно, я мог бы использовать AES_DECRYPT внутри запроса, но если я отправлю такой оператор SELECT с AES_DECRYPT с Node.JS на сервер MySQL, тогда мое зашифрованное имя пользователя и пароль будут отправлены обратно в виде открытого текста или, по крайней мере, расшифрованы :(и я хотел избежать этого ... – innc

ответ

8

Ваши пароли должны быть преобразованы так же, как MySQL будет делать это внутренне. Должен привести пароль XORd длиной более 16 байтов для более длинных паролей или с добавлением 0-байтов. Эта функция должна выполнять работу:

function convertCryptKey(strKey) { 
    var newKey = new Buffer([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); 
    strKey = new Buffer(strKey); 
    for(var i=0;i<strKey.length;i++) newKey[i%16]^=strKey[i]; 
    return newKey; 
} 

MySQL-совместимый шифрования - обратите внимание, чтобы использовать "createCipheriv" ​​с пустой IV. (CreateCipher создает собственный IV, который не является такой же, как и в MySQL)

var c = crypto.createCipheriv("aes-128-ecb", convertCryptKey("myPassword"), ""); 
var crypted = c.update('Take a trip at galaxytrek.com :)', 'utf8', 'hex') + c.final('hex'); 
console.log(crypted.toUpperCase()); 
>> 92068A5DAECE1E080EF4BA08A45CFF8D2262401F988A9241F1E4CEAAAB80BEAF7E0B50A1D5FD57CA56E92621622F018D 

который так же, как:

mysql> select hex(aes_encrypt('Take a trip at galaxytrek.com :)','myPassword')); 
+--------------------------------------------------------------------------------------------------+ 
| hex(aes_encrypt('Take a trip at galaxytrek.com :)','myPassword'))        | 
+--------------------------------------------------------------------------------------------------+ 
| 92068A5DAECE1E080EF4BA08A45CFF8D2262401F988A9241F1E4CEAAAB80BEAF7E0B50A1D5FD57CA56E92621622F018D | 
+--------------------------------------------------------------------------------------------------+ 

расшифровке

var dc = crypto.createDecipheriv("aes-128-ecb", convertCryptKey("myPassword"), ""); 
var decrypted = dc.update('92068A5DAECE1E080EF4BA08A45CFF8D2262401F988A9241F1E4CEAAAB80BEAF7E0B50A1D5FD57CA56E92621622F018D', 'hex', 'utf8') + dc.final('utf8'); 
console.log(decrypted); 
>> Take a trip at galaxytrek.com :) 
+0

Ты гений, мой друг, извините, я не могу принять ваш ответ, поскольку я не задавал вопрос – ykay

+0

Старый вопрос: Спасибо за вышеупомянутый ответ. Но я не могу воспроизвести выше шаги для aes -256-cbc (Использование версии узла v6.9.2) – Shrey