以下代码为单点登录按钮生成HTML输出,该按钮将添加到页面中。在节点版本0.5.x中,服务器在按钮单击时接受密钥,但在升级到0.10.x之后,它不起作用并产生不同的输出。没有错误。加密类改变了吗?请注意,密钥,网址和iv已略有更改,以避免发布安全信息,但长度正确。
var util = require('util');
var crypto = require('crypto');
var fs = require('fs');
var dateFormat = require('dateformat');
var AESCrypt = {};
AESCrypt.encrypt = function(cryptkey, iv, cleardata) {
var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv),
encryptdata = encipher.update(cleardata);
encryptdata += encipher.final('binary');
encode_encryptdata = new Buffer(encryptdata, 'binary').toString('hex');
return encode_encryptdata;
}
function getKey(email){
var now = new Date();
var key = new Buffer("F4553ECE8E0039675E8DA176D23BD82D455BB6272B574FDD6185296432CE1AD9",'hex'),
iv = new Buffer("D95897EA52A8A0C8DF231C8F2DBE59A7",'hex'),
key_bin = key.toString('binary'),
iv_bin = iv.toString('binary'),
text = new Buffer('mystring','ascii'),
text_bin = text.toString('binary');
var enc = AESCrypt.encrypt(key_bin, iv_bin, text_bin);
var page = '<form method="POST" action="https://somedomain.com/AES.aspx"><input type="hidden" name="key" value="'+enc+'"/><input type="hidden" name="ouid" value="1"/><input type="submit" value="Log ine"/></form>';
return page;
}
if(process.argv[2]) {
email = process.argv[2];
console.log(getKey(email));
}
else{
console.log('Something may be wrong with your email address>')
}
答案 0 :(得分:3)
似乎 - 至少对于NodeJS的更高版本 - 需要Buffer.concat()
而不是+=
运算符。
答案 1 :(得分:2)
Woking代码:
var crypto = require('crypto');
var ecr = function(str)
{
var cipher = crypto.createCipher('aes-256-cbc', 'passphase');
var cryptedBuffers = [cipher.update(new Buffer(str))];
cryptedBuffers.push(cipher.final());
var crypted = Buffer.concat(cryptedBuffers);
return crypted;
};
var dcr = function(str)
{
var dcipher = crypto.createDecipher('aes-256-cbc', 'passphase');
var dcryptedBuffers = [dcipher.update(new Buffer(str))];
dcryptedBuffers.push(dcipher.final());
var dcrypted = Buffer.concat(dcryptedBuffers)
.toString('utf8');
return dcrypted;
};
console.log(dcr(ecr('hello test')));