Javascript GO解密nodejs已被弃用的数据加密方法?
这是我接手的一个有4年历史的nodejs项目,我被要求使用golang对其进行重构,但在重构过程中我发现nodejs加密被弃用。而且,我不知道AES的哪种模式被用来加密这段代码 有专家能帮我看看如何用golang解密这个nodejs加密吗?多谢各位 nodejs的加密代码:Javascript GO解密nodejs已被弃用的数据加密方法?,javascript,node.js,node-crypto,Javascript,Node.js,Node Crypto,这是我接手的一个有4年历史的nodejs项目,我被要求使用golang对其进行重构,但在重构过程中我发现nodejs加密被弃用。而且,我不知道AES的哪种模式被用来加密这段代码 有专家能帮我看看如何用golang解密这个nodejs加密吗?多谢各位 nodejs的加密代码: exports.createToken = function (src: string, timestamp: string, key: any) { var msg = src + '|' + timestamp;
exports.createToken = function (src: string, timestamp: string, key: any) {
var msg = src + '|' + timestamp;
var cipher: any = CryptoJS.createCipher('aes256', key);
var enc: any = cipher.update(msg, 'utf8', 'hex');
enc += cipher.final('hex');
return enc;
};
exports.parseToken = function (token: string, key: string): any {
let decipher = CryptoJS.createDecipher('aes256', key);
let dec: string;
try {
dec = decipher.update(token, 'hex', 'utf8');
dec += decipher.final('utf8');
} catch (err) {
console.error('[token] fail to decrypt token. %j', token);
return null;
}
var ts = dec.split('|');
if (ts.length !== 2) {
// illegal token
return null;
}
return { src: ts[0], timestamp: Number(ts[1]) };
};
nodejs的解密代码:
exports.createToken = function (src: string, timestamp: string, key: any) {
var msg = src + '|' + timestamp;
var cipher: any = CryptoJS.createCipher('aes256', key);
var enc: any = cipher.update(msg, 'utf8', 'hex');
enc += cipher.final('hex');
return enc;
};
exports.parseToken = function (token: string, key: string): any {
let decipher = CryptoJS.createDecipher('aes256', key);
let dec: string;
try {
dec = decipher.update(token, 'hex', 'utf8');
dec += decipher.final('utf8');
} catch (err) {
console.error('[token] fail to decrypt token. %j', token);
return null;
}
var ts = dec.split('|');
if (ts.length !== 2) {
// illegal token
return null;
}
return { src: ts[0], timestamp: Number(ts[1]) };
};
不推荐使用的方法和应用专有的OpenSSL函数从密码派生32字节的密钥和16字节的IV。不使用盐,摘要MD5和迭代计数为1。这个算法非常不安全,这就是为什么这两种方法都不推荐的原因
发布的代码应用aes-256-cbc(即cbc模式下的aes-256),仅此密钥派生即可派生密钥/IV对。由于密钥派生不使用salt,因此对于相同的明文和密码,始终会产生相同的密文结果。例如:
var src='敏捷的棕色狐狸跳过懒狗';
var timestamp='1616409134831';
var passphrase='my secret passphrase';
密文是:
60673700FB64DA36B65829EE3C578D1EC675638A95C8DEE4E7C026EE72A837C2170C13B7B24125C02871663A64FD646DD999493943EEB70B3E959CBC4CD423A
因此,对于Go中的解密,您需要实现EVP\u BytesToKey()
,例如:
主程序包
进口(
“加密/aes”
“加密/密码”
“fmt”
“github.com/walkert/go-evp”
“编码/十六进制”
)
func main(){
key,iv:=evp.BytesToKeyAES256CBCMD5([]字节(“”,[]字节(“我的秘密密码”)//MD5,无盐,密码:我的秘密密码
密文,——=十六进制解码字符串(“60673700FB64DA36B65829EE3C578D1EC675638A95C8DEE4E7C026EE72A837C2170C13B7B24125C02871663A64FD646DD999793943EEB70B3E959CBC4CD423A”)
块,错误:=aes.NewCipher(密钥)
如果错误!=零{
恐慌(错误)
}
cbc:=密码.NewCBCDecrypter(块,iv)
明文填充:=make([]字节,len(密文))
密码块(明文填充,密文)
纯文本:=字符串(PKCS7Unpad(纯文本填充))
Println(“解密数据:,字符串(明文))
}
func PKCS7Unpad(src[]字节)[]字节{//PKCS7 unpad fromhttps://stackoverflow.com/a/41595640/9014097
长度:=长度(src)
取消添加:=int(src[length-1])
返回src[:(长度-未添加)]
}
运行此代码将产生上述明文。不推荐使用的方法,并应用专有的OpenSSL函数从密码中派生32字节的密钥和16字节的IV。不使用盐,摘要MD5和迭代计数为1。这个算法非常不安全,这就是为什么这两种方法都不推荐的原因
发布的代码应用aes-256-cbc(即cbc模式下的aes-256),仅此密钥派生即可派生密钥/IV对。由于密钥派生不使用salt,因此对于相同的明文和密码,始终会产生相同的密文结果。例如:
var src='敏捷的棕色狐狸跳过懒狗';
var timestamp='1616409134831';
var passphrase='my secret passphrase';
密文是:
60673700FB64DA36B65829EE3C578D1EC675638A95C8DEE4E7C026EE72A837C2170C13B7B24125C02871663A64FD646DD999493943EEB70B3E959CBC4CD423A
因此,对于Go中的解密,您需要实现EVP\u BytesToKey()
,例如:
主程序包
进口(
“加密/aes”
“加密/密码”
“fmt”
“github.com/walkert/go-evp”
“编码/十六进制”
)
func main(){
key,iv:=evp.BytesToKeyAES256CBCMD5([]字节(“”,[]字节(“我的秘密密码”)//MD5,无盐,密码:我的秘密密码
密文,——=十六进制解码字符串(“60673700FB64DA36B65829EE3C578D1EC675638A95C8DEE4E7C026EE72A837C2170C13B7B24125C02871663A64FD646DD999793943EEB70B3E959CBC4CD423A”)
块,错误:=aes.NewCipher(密钥)
如果错误!=零{
恐慌(错误)
}
cbc:=密码.NewCBCDecrypter(块,iv)
明文填充:=make([]字节,len(密文))
密码块(明文填充,密文)
纯文本:=字符串(PKCS7Unpad(纯文本填充))
Println(“解密数据:,字符串(明文))
}
func PKCS7Unpad(src[]字节)[]字节{//PKCS7 unpad fromhttps://stackoverflow.com/a/41595640/9014097
长度:=长度(src)
取消添加:=int(src[length-1])
返回src[:(长度-未添加)]
}
运行此代码将产生上述明文。非常感谢您的回复,您的代码非常有用,解决了我当前的焦虑。它教会了我比我所知道的更多的东西。再次感谢你,祝你生活愉快!非常感谢您的回复,您的代码非常有用,解决了我目前的焦虑。它教会了我比我所知道的更多的东西。再次感谢你,祝你生活愉快!