Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GO解密nodejs已被弃用的数据加密方法?_Javascript_Node.js_Node Crypto - Fatal编程技术网

Javascript GO解密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;

这是我接手的一个有4年历史的nodejs项目,我被要求使用golang对其进行重构,但在重构过程中我发现nodejs加密被弃用。而且,我不知道AES的哪种模式被用来加密这段代码

有专家能帮我看看如何用golang解密这个nodejs加密吗?多谢各位

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]) };
};
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[:(长度-未添加)]
}

运行此代码将产生上述明文。

非常感谢您的回复,您的代码非常有用,解决了我当前的焦虑。它教会了我比我所知道的更多的东西。再次感谢你,祝你生活愉快!非常感谢您的回复,您的代码非常有用,解决了我目前的焦虑。它教会了我比我所知道的更多的东西。再次感谢你,祝你生活愉快!