2012-12-15 55 views
5

我在.Net中創建了一個加密的cookie,我試圖解密它在nodejs中的內容。但不斷的NodeJS拋出異常「類型錯誤:DecipherFinal失敗」在nodejs中解密.Net cookie

在.NET中我使用了AES加密方法與關鍵

932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC.

我的web.config文件中有如下一行

<machineKey validationKey="A5326FFC9D3B74527AECE124D0B7BE5D85D58AFB12AAB3D76319B27EE57608A5A7BCAB5E34C7F1305ECE5AC78DB1FFEC0A9435C316884AB4C83D2008B533CFD9" 
decryptionKey="932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC" 
validation="SHA1" decryption="AES" /> 

和產生我在.net中的cookie的代碼如下所示:

var ticket = new FormsAuthenticationTicket(0, "test", DateTime.Now, DateTime.Now.AddYears(1), true, "test"); 
var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
Response.Cookies.Add(new HttpCookie(cookieName, encryptedTicket)); 

用於解密cookie中的代碼的NodeJS是

var crypto = require('crypto'); 
var logger = require('winston'); 
var deckey = "932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC"; 

function hex2a(hex) { 
    var str = ''; 
    for (var i = 0; i < hex.length; i += 2) 
    str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); 
    return str; 
} 

function decrypt(cookie) {   
    var ivc = cookie, iv, cipherText, ivSize = 16, res; 

    ivc = new Buffer(ivc, 'hex'); 
    iv = new Buffer(ivSize); 

    cipherText = new Buffer(ivc.length - ivSize); 
    ivc.copy(iv, 0, 0, ivSize); 
    ivc.copy(cipherText, 0, ivSize); 

    iv = new Buffer(Array(16)); 
    c = crypto.createDecipheriv('aes-256-cbc', hex2a(deckey), iv.toString()); 
    res = c.update(cipherText, 'binary'); 
    res += c.final('binary'); //<-- throws TypeError: DecipherFinal fail 
    return res; 
} 

我有點失落,我將不勝感激,這可能是問題的技巧或想法。

+0

您是否有資源告訴您在FormsAuthentication.Encrypt()中執行了哪種加密? Microsoft **再次**不指定該方法的實際輸出。 –

+0

最近我一直有這個問題,對.Net 4.5。有沒有人在解密節點中的cookie方面取得了進展? – JasonB

+0

@JasonB我回答了[一個非常類似的問題](http://stackoverflow.com/q/34882672/5128464) - 可能對你很有意思。 – vlp

回答

0

甲鍵不是字符串,看看該方法fromCharCode()

The fromCharCode() method converts Unicode values into characters.

這意味着任何十六進制轉換爲文本字符,而createDecipheriv()方法規定:

key and iv must be 'binary' encoded strings or buffers.

請注意,這只是可能存在的問題之一,我還沒有時間運行代碼(還)。

0

您的問題可能是自動填充失敗,默認情況下打開。你想關閉這個功能,通過添加:

c.setAutoPadding(false); 
1

你可以看到密型的源代碼,並與所有不同的可能性(Framework20SP1,Framework20SP2等)

https://github.com/Microsoft/referencesource/blob/master/System.Web/Security/FormsAuthentication.cs

它解密這裏花了我幾個小時來閱讀這些代碼,但一旦你掌握了它,就可以爲你的特定加密設置編寫一個簡單的代碼。

+0

[這部分](https://github.com/Microsoft/referencesource/blob/4fe4349175f4c5091d972a7e56ea12012f1e7170/System.Web/Configuration/MachineKeySection.cs#L474)也非常相關。 – vlp