3

バッファオブジェクトにAES解読を使用する際に問題があり、誰かが私が間違っていることを知っていることを願っています...

MyExample: ユーザー名とパスワードに AES_ENCRYPT を使用する MySQL テーブルがあります...

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: node-mysql モジュールを使用してクエリをデータベースに送信しています。

SELECT * FROM Accounts;

パスワードとユーザー名には、次のような値が返されます。

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

Node.JS decipher メソッドでデコードする方法は? 私の試みはすべて失敗しました... AES-128-ECBが正しく選択されていることを願っています...

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);

助けてくれてありがとう:)

4

1 に答える 1

10

パスワードは、MySQL が内部で行うのと同じ方法で変換する必要があります。より長いパスワードの場合は、16 バイト長のパスワード XORd になるか、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 互換の暗号化- 空の IV で「createCipheriv」を使用することに注意してください。(createCipher は、MySQL とは異なる独自の IV を作成します)

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 :)
于 2013-06-21T08:33:06.013 に答える