2013-03-12 83 views
4

我寫了一個數據加密工具,它可以在mac os上運行,但不能在ubuntu上運行。 以下代碼顯示了差異。nodejs cipher ubuntu沒有按預期工作

var crypto = require('crypto'); 

var k = '123456789'; 
var v = '123456789'; 
var alg = 'AES-128-CBC'; 


var buf = new Buffer('Hello world!'); 
console.log(buf); 

var cipher = crypto.createCipheriv(alg, k, v); 
var result = cipher.update(buf); 
result += cipher.final(); 
buf = new Buffer(result, 'binary'); 
console.log(buf); 

var decipher = crypto.createDecipheriv(alg, k, v); 
decipher.setAutoPadding(auto_padding=false); 
result = decipher.update(buf); 
result += decipher.final(); 
buf = new Buffer(result, 'binary'); 

console.log(buf); 
console.log(buf.toString()); 

輸出,在Mac上:

<Buffer 48 65 6c 6c 6f 20 77 6f 72 6c 64 21> 
<Buffer 17 0e 2d 73 94 bf d4 24 95 b3 a7 49 73 58 5e 3f> 
<Buffer 48 65 6c 6c 6f 20 77 6f 72 6c 64 21 04 04 04 04> 
Hello world! 

Ubuntu的:

<Buffer 48 65 6c 6c 6f 20 77 6f 72 6c 64 21> 
<Buffer 17 0e 2d 73 fd fd fd 24 fd fd fd 49 73 58 5e 3f> 
<Buffer 05 6d 69 fd fd 1b 49 62 60 39 fd 68 fd fd fd> 
mi��Ib`9�h��� 

什麼想法? thx

+0

我不能在ubuntu中重現。我運行的Ubuntu 12.04,節點0.8,一切都很好。你的系統設置是什麼? – matehat 2013-03-12 15:37:50

+0

我可以在Debian上使用節點0.10.0在i386和x86_64平臺上重現它。這聽起來像它可能是一個過時的OpenSSL庫(我的機器都不是最新的)。 – robertklep 2013-03-12 15:43:22

+0

上次我檢查了crypto API頁面,它是3 - 表,但現在頁面讀取穩定性:2 - 不穩定。所以你應該使用節點0.8或等到它們穩定。 – user568109 2013-03-12 17:06:10

回答

3

節點0.10.0引入了對crypto模塊的一些內部更改,這可能會破壞現有的代碼。

用下面的修補程序(如http://nodejs.org/api/crypto.html#crypto_recent_api_changes建議),它的工作原理我的Debian機器上:

var crypto = require('crypto'); 
crypto.DEFAULT_ENCODING = 'binary'; 
... 

(!感謝@ user568109讓我閱讀的頁面)

上述頁面還提出建議以永久修復您的代碼,因爲設置crypto.DEFAULT_ENCODING被認爲是一種臨時措施。

+1

(剛剛檢查過,Mac上的節點0.10.0原始代碼也失敗) – robertklep 2013-03-12 17:36:30