Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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
Node.js crypto.randomBytes不接受md5生成的utf8字符串_Node.js_Encryption_Hash_Encoding_Utf 8 - Fatal编程技术网

Node.js crypto.randomBytes不接受md5生成的utf8字符串

Node.js crypto.randomBytes不接受md5生成的utf8字符串,node.js,encryption,hash,encoding,utf-8,Node.js,Encryption,Hash,Encoding,Utf 8,我的代码如下所示: let createCipher = (req, res) => { const token = req.body.token; let keyVal = req.body.keyVal; const codeToken = utf8.encode(token); keyVal = utf8.encode(keyVal); console.log("keyVal " + keyVal); let hash = crypto

我的代码如下所示:

let createCipher = (req, res) => {
    const token = req.body.token;
    let keyVal = req.body.keyVal;
    const codeToken = utf8.encode(token);
    keyVal = utf8.encode(keyVal);
    console.log("keyVal " + keyVal);
    let hash = crypto.createHash('md5').update(codeToken).digest('hex');
    console.log("hash " + hash);
    var sharedSecret = crypto.randomBytes(hash);
    var initializationVector = crypto.randomBytes(hash);
    console.log("iv " + initializationVector);
    var encrypted;
    cipher = crypto.Cipheriv('aes-128-cbc', sharedSecret, initializationVector);
    encrypted += cipher.update(keyVal, 'utf8', 'base64');
    encrypted += cipher.final('base64');
    res.json({
        status: '200',
        cipher: encrypted
    });
}
TypeError: size must be a number >= 0
            <br> &nbsp; &nbsp;at TypeError (native)
            <br> &nbsp; &nbsp;at createCipher (C:\Users\anand\quFlipApi\controller\test.js:17:31)
            <br> &nbsp; &nbsp;at Layer.handle [as handle_request] (C:\Users\anand\quFlipApi\node_modules\express\lib\router\layer.js:95:5)
            <br> &nbsp; &nbsp;at trim_prefix (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:317:13)
            <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:284:7
            <br> &nbsp; &nbsp;at Function.process_params (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:335:12)
            <br> &nbsp; &nbsp;at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:275:10)
            <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:635:15
            <br> &nbsp; &nbsp;at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:260:14)
            <br> &nbsp; &nbsp;at Function.handle (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:174:3)
            <br> &nbsp; &nbsp;at router (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:47:12)
            <br> &nbsp; &nbsp;at Layer.handle [as handle_request] (C:\Users\anand\quFlipApi\node_modules\express\lib\router\layer.js:95:5)
            <br> &nbsp; &nbsp;at trim_prefix (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:317:13)
            <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:284:7
            <br> &nbsp; &nbsp;at Function.process_params (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:335:12)
            <br> &nbsp; &nbsp;at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:275:10)
            <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\body-parser\lib\read.js:129:5
            <br> &nbsp; &nbsp;at invokeCallback (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:262:16)
            <br> &nbsp; &nbsp;at done (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:251:7)
            <br> &nbsp; &nbsp;at IncomingMessage.onEnd (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:307:7)
            <br> &nbsp; &nbsp;at emitNone (events.js:86:13)
            <br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:185:7)
我已经按照下面给出的步骤编写了上述代码:

  • UTF-8对Tentoken字符串进行编码并生成其MD5哈希
  • UTF-8对密钥-值对字符串进行编码,并使用AES-128加密和密码块链接(CBC)模式进行加密。 A.将键和初始化向量(IV)设置为步骤1的结果
  • Base64对2的结果进行编码
  • 但是上面的代码给出了如下所示的错误:

    let createCipher = (req, res) => {
        const token = req.body.token;
        let keyVal = req.body.keyVal;
        const codeToken = utf8.encode(token);
        keyVal = utf8.encode(keyVal);
        console.log("keyVal " + keyVal);
        let hash = crypto.createHash('md5').update(codeToken).digest('hex');
        console.log("hash " + hash);
        var sharedSecret = crypto.randomBytes(hash);
        var initializationVector = crypto.randomBytes(hash);
        console.log("iv " + initializationVector);
        var encrypted;
        cipher = crypto.Cipheriv('aes-128-cbc', sharedSecret, initializationVector);
        encrypted += cipher.update(keyVal, 'utf8', 'base64');
        encrypted += cipher.final('base64');
        res.json({
            status: '200',
            cipher: encrypted
        });
    }
    
    TypeError: size must be a number &gt;= 0
                <br> &nbsp; &nbsp;at TypeError (native)
                <br> &nbsp; &nbsp;at createCipher (C:\Users\anand\quFlipApi\controller\test.js:17:31)
                <br> &nbsp; &nbsp;at Layer.handle [as handle_request] (C:\Users\anand\quFlipApi\node_modules\express\lib\router\layer.js:95:5)
                <br> &nbsp; &nbsp;at trim_prefix (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:317:13)
                <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:284:7
                <br> &nbsp; &nbsp;at Function.process_params (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:335:12)
                <br> &nbsp; &nbsp;at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:275:10)
                <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:635:15
                <br> &nbsp; &nbsp;at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:260:14)
                <br> &nbsp; &nbsp;at Function.handle (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:174:3)
                <br> &nbsp; &nbsp;at router (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:47:12)
                <br> &nbsp; &nbsp;at Layer.handle [as handle_request] (C:\Users\anand\quFlipApi\node_modules\express\lib\router\layer.js:95:5)
                <br> &nbsp; &nbsp;at trim_prefix (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:317:13)
                <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:284:7
                <br> &nbsp; &nbsp;at Function.process_params (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:335:12)
                <br> &nbsp; &nbsp;at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:275:10)
                <br> &nbsp; &nbsp;at C:\Users\anand\quFlipApi\node_modules\body-parser\lib\read.js:129:5
                <br> &nbsp; &nbsp;at invokeCallback (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:262:16)
                <br> &nbsp; &nbsp;at done (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:251:7)
                <br> &nbsp; &nbsp;at IncomingMessage.onEnd (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:307:7)
                <br> &nbsp; &nbsp;at emitNone (events.js:86:13)
                <br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:185:7)
    
    TypeError:大小必须是一个数字=0
    
    at TypeError(本机)
    在CreateChipher(C:\Users\anand\quFlipApi\controller\test.js:17:31)
    在Layer.handle[作为handle\u请求](C:\Users\anand\qufipapi\node\u modules\express\lib\router\Layer.js:95:5)
    在trim_前缀处(C:\Users\anand\qufipapi\node_modules\express\lib\router\index.js:317:13)
    位于C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:284:7
    在Function.process_参数处(C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:335:12)
    下一步(C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:275:10)
    在C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:635:15
    下一步(C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:260:14)
    位于Function.handle(C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:174:3)
    在路由器上(C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:47:12)
    在Layer.handle[作为handle\u请求](C:\Users\anand\qufipapi\node\u modules\express\lib\router\Layer.js:95:5)
    在trim_前缀处(C:\Users\anand\qufipapi\node_modules\express\lib\router\index.js:317:13)
    位于C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:284:7
    在Function.process_参数处(C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:335:12)
    下一步(C:\Users\anand\qufipapi\node\u modules\express\lib\router\index.js:275:10)
    在C:\Users\anand\qufipapi\node\u modules\body parser\lib\read.js:129:5
    在invokeCallback(C:\Users\anand\quFlipApi\node\u modules\raw body\index.js:262:16)
    完成时(C:\Users\anand\qufipapi\node\u modules\raw body\index.js:251:7)
    在IncomingMessage.onEnd(C:\Users\anand\qufipapi\node\u modules\raw body\index.js:307:7)
    在emitNone(events.js:86:13)
    在IncomingMessage.emit(events.js:185:7)

    这里我的代码不接受从
    crypto.randomBytes(hash)
    中的上一步生成的散列。此执行过程中是否缺少任何方法?

    crypto.randomBytes
    ,并返回名称所示的随机字节

    不能给它一个字符串作为参数

    我真的不明白,为什么要生成两倍的随机字节。也许这就足够了

    let hash = crypto.createHash('md5').update(codeToken).digest();
    console.log("hash" + hash.toString('hex'));
    var initializationVector = crypto.randomBytes(16);
    console.log("iv " + initializationVector); 
    var encrypted = crypto.Cipheriv('aes-128-cbc', hash, initializationVector);
    

    但是,我如何才能像我在步骤中提到的那样传递key和iv呢?我不知道你的算法,所以这里有一个猜测。我尝试了你的代码,但它给了我错误。我已经在我的代码中更新了算法步骤,那么代码是否符合该算法?@Mthaker我修复了代码中的大小问题(十六进制编码的MD5哈希长度为32字节,而不是16字节)。IV必须是不可预测的(读取:随机)。不要使用静态IV或从密钥派生的IV(在本例中是相同的),因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前面加上前缀并在解密之前切掉。“crypto.randomBytes不接受md5生成的utf8字符串”-您认为它为什么应该这样做
    crypto.randomBytes
    生成,因为名称已经表示随机字节。您可以给出的唯一输入是它应该生成的字节数。你想通过它实现什么?AES-128-CBC需要一个16字节的密钥和一个16字节的IV。您将生成的密钥存储在哪里?