【发布时间】:2017-11-08 09:17:01
【问题描述】:
我的代码如下图:
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
});
}
我已经按照下面给出的步骤编写了上面的代码:
- UTF-8 编码 TempToken 字符串并生成它的 MD5 哈希。
- UTF-8 对键值对字符串进行编码,并使用密码块链接 (CBC) 模式使用 AES-128 加密进行加密。 一种。将密钥和初始化向量 (IV) 设置为等于步骤 1 的结果。
- Base64 编码 2 的结果
但是上面的代码给了我如下所示的错误:
TypeError: size must be a number >= 0
<br> at TypeError (native)
<br> at createCipher (C:\Users\anand\quFlipApi\controller\test.js:17:31)
<br> at Layer.handle [as handle_request] (C:\Users\anand\quFlipApi\node_modules\express\lib\router\layer.js:95:5)
<br> at trim_prefix (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:317:13)
<br> at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:284:7
<br> at Function.process_params (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:335:12)
<br> at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:275:10)
<br> at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:635:15
<br> at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:260:14)
<br> at Function.handle (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:174:3)
<br> at router (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:47:12)
<br> at Layer.handle [as handle_request] (C:\Users\anand\quFlipApi\node_modules\express\lib\router\layer.js:95:5)
<br> at trim_prefix (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:317:13)
<br> at C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:284:7
<br> at Function.process_params (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:335:12)
<br> at next (C:\Users\anand\quFlipApi\node_modules\express\lib\router\index.js:275:10)
<br> at C:\Users\anand\quFlipApi\node_modules\body-parser\lib\read.js:129:5
<br> at invokeCallback (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:262:16)
<br> at done (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:251:7)
<br> at IncomingMessage.onEnd (C:\Users\anand\quFlipApi\node_modules\raw-body\index.js:307:7)
<br> at emitNone (events.js:86:13)
<br> at IncomingMessage.emit (events.js:185:7)
这里我的代码不接受crypto.randomBytes(hash) 中上一步生成的hash。这次执行中是否缺少任何方法?
【问题讨论】:
-
“crypto.randomBytes 不接受 md5 生成的 utf8 字符串” - 为什么你认为它应该?
crypto.randomBytes生成的名称已经暗示了随机字节。您可以提供的唯一输入是它应该生成的字节数。你想通过它达到什么目的? AES-128-CBC 需要一个 16 字节的密钥和一个 16 字节的 IV。您将生成的密钥存储在哪里?
标签: node.js encryption hash encoding utf-8