我在.Net中创建了一个加密的cookie,我试图解密它在nodejs中的内容。但是nodejs不断抛出异常“TypeError:DecipherFinal fail”
在.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 :(得分:1)
您可以在此处看到Encryp和Decrypt的源代码,其中包含所有不同的可能性(Framework20SP1,Framework20SP2等)
https://github.com/Microsoft/referencesource/blob/master/System.Web/Security/FormsAuthentication.cs
我花了几个小时阅读该代码,但是一旦获得该代码,就可以为您的特定加密设置编写一个简单的代码。
答案 1 :(得分:0)
密钥不是字符串,请查看方法fromCharCode()
:
fromCharCode()
方法将Unicode值转换为字符。
这意味着任何十六进制都会转换为文本字符,而createDecipheriv()
方法则指定:
key和iv必须是'二进制'编码的字符串或缓冲区。
请注意,这只是可能出现的问题之一,我还没来得及运行代码。
答案 2 :(得分:0)
您的问题可能是自动填充失败,默认情况下处于启用状态。你想通过添加:
来关闭它c.setAutoPadding(false);