2013-03-21 57 views
2

我有使用AES解密一個緩衝對象,我希望有人有一個想法出了問題,我在做什麼錯?解密MySQL的AES_ENCRYPT在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正確choosen ...

要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 NG。你不能在查詢中使用'AES_DECRYPT'嗎? – robertklep 2013-03-21 11:40:06

+0

@robertklep當然我可以在查詢中使用AES_DECRYPT,但是如果我發送了一個SELECT_語句,它具有從Node.JS到MySQL服務器的AES_DECRYPT,那麼我的加密用戶名和密碼將以明文形式發回,或至少解密:(和我想避免這個... – innc 2013-03-21 12:44:13

回答

8

您的密碼必須以與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的兼容加密 - 注意要使用 「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 2015-10-12 13:23:40

+0

老問題:謝謝你的回答,但我無法重現以上步驟-256-cbc(使用節點版本v6.9.2) – Shrey 2017-03-20 08:17:26