这个函数在Javascript/NodeJs中的等价物是什么?

这个函数在Javascript/NodeJs中的等价物是什么?,javascript,php,node.js,encryption,openssl,Javascript,Php,Node.js,Encryption,Openssl,这是php中用于加密的函数 function generatetoken() { $token = ['id' => '123456','name' => 'username','email' => 'useremail@example.com','type' => 'user']; $cipher = "AES-128-CBC"; $plaintext = json_encode($token); $ivlen = o

这是php中用于加密的函数

function generatetoken()
{
    $token = ['id' => '123456','name' => 'username','email' => 'useremail@example.com','type' => 'user'];
    $cipher = "AES-128-CBC";
    $plaintext = json_encode($token);
    $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext_raw = openssl_encrypt($plaintext, $cipher, '123456789', $options = OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext_raw, '123456789', $as_binary = true);
    $ciphertext = base64_encode($iv . $hmac . $ciphertext_raw);       
    return ciphertext;
}
我有一个在php中解密文本的函数:

function decodetokeninPhp($request_token)
{
    $cipher = "AES-128-CBC";
    $c = base64_decode($request_token);
    $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
    $iv = substr($c, 0, $ivlen);
    $hmac = substr($c, $ivlen, $sha2len = 32);
    $ciphertext_raw = substr($c, $ivlen + $sha2len);
    $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, '123456789', $options = OPENSSL_RAW_DATA, $iv);
    $calcmac = hash_hmac('sha256', $ciphertext_raw, '123456789', $as_binary = true);
    if (hash_equals($hmac, $calcmac)) {
      return json_encode($original_plaintext);
    } else {
       return null;
    }
}
我想在javascript/Nodejs中实现这一点,我尝试了以下方法:

function decode(token){
var password = 'My-key';
const ivLength = 16;
const sha2len = 32;
let replacedToken = token.toString();
const base64decoded = Buffer.from(replacedToken, 'base64').toString('binary');
const iv = replacedToken.substr(0,ivLength);
const hMac= replacedToken.substr( ivLength,sha2len);
const ciphertext_raw = replacedToken.substr(ivLength+sha2len);

var DataEncrypt = ciphertext_raw;
var DataKey = CryptoJS.enc.Utf8.parse(password);
var DataVector = CryptoJS.enc.Utf8.parse(iv);
var decrypted = CryptoJS.AES.decrypt(DataEncrypt, DataKey, { iv: DataVector });        
var decrypted = CryptoJS.enc.Utf8.stringify(JSON.stringify(decrypted));
console.log("token decoded"+ decrypted);
}
  
但是console.log只打印“token decoded:”,结果为空:(


请有人帮帮我,我快疯了:/

如果你想使用NodeJS的加密模块,整个CryptoJS部分都必须更改。使用crypto的一个可能实现是:

var crypto = require('crypto');

function decode(token){

    var keyDec = Buffer.from('0123456789012345', 'utf8'); // sample key for encryption/decryption
    var keyAuth = Buffer.from('0123456789', 'utf8');      // sample key for authentication
    var ivLen = 16;
    var macLen = 32;
    var tokenBuf = Buffer.from(token, 'base64');
    var iv = tokenBuf.slice(0, ivLen);
    var mac = tokenBuf.slice(ivLen, ivLen + macLen);
    var ciphertext = tokenBuf.slice(ivLen + macLen);

    // Authenticate
    var hmac = crypto.createHmac('sha256', keyAuth);
    hmac.update(ciphertext);
    var macCalc = hmac.digest();

    if (macCalc.equals(mac)) {

        // Decrypt, if authentication is successfull
        var decipher = crypto.createDecipheriv("AES-128-CBC", keyDec, iv);
        var decrypted = decipher.update(ciphertext, '', 'utf-8');
        decrypted += decipher.final('utf-8');
        return JSON.parse(decrypted);
    } else {
        console.log("Decryption failed");
    }
}

var token = decode('U3pukkS48yeNpsusv43Tmv2AmmDfYVtQ8jPw2izEQ0CVOfutGtA9e3ZWXJo2Ibi2axo31blnW6uq/yCz/KRSltwGhCmwpiHQ8mP5ulMf0Nr9V9Gzr6r+R6y3ZOpzTsV9IEkaKDxZTihfoDAzeyN9LYKS9uUW6URL0Do1HGaZ51o='); // from PHP code
console.log(token);
这里,密文是使用发布的PHP代码生成的,分别使用用于加密和身份验证的示例密钥
0123456789012345
0123456789


我怀疑用于解密的PHP代码中的
json\u encode()
。在这里,我希望是
json\u decode()
,因此,在NodeJS代码中是
json.parse().

您是否记录了以前的值以检测其变为空的位置?为什么要用
var
初始化某些变量?如果您没有,您可以将所有变量都更改为
let
,甚至
const
reassigning@El_Vanja是,在此行中,结果变为空:var decrypted=CryptoJS.enc.Utf8.stringify(JSON.stringify(decrypted));@adiga是的,你是对的,我会改变这一点,因为现在我只是想让这一点起作用,我对它发疯了:/Ok,那么在你把
解密的
输入到那行之前它的价值是什么呢?就这样,谢谢妈妈,你救了我的一天和我的理智,非常感谢:)