这是一个错误:
(节点:35798)UnhandledPromiseRejectionWarning:TypeError[ERR_INVALID_ARG_TYPE]:“iv”参数的类型必须是string或Buffer、TypedArray或DataView的实例。接收到未定义的
1.JS
router.post(
"/",
async(req, res) => {
function getFullAddress({housenumber, address1, address2, city, postcode, country}) {
return [housenumber, address1, ...(address2 ? [address2]: []), city, postcode, country].join(", ");
}
const aes256gcm = (key) => {
const encrypt = (str) => {
const iv = new crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
let enc = cipher.update(str, 'utf8', 'base64');
enc += cipher.final('base64');
return Buffer.concat([Buffer.from(enc), iv, cipher.getAuthTag()]).toString("base64");
};
return {
encrypt,
};
};
const aesCipher = aes256gcm(key);
const hashedPasscode = await bcrypt.hash(req.body.passcode, 12);
await User.create({
email: req.body.email,
mobilenumber: aesCipher.encrypt(req.body.mobilenumber),
passcode: hashedPasscode,
address: aesCipher.encrypt(getFullAddress(req.body))
})
router.get(
"/",
async(req, res) => {
const aes256gcm = (key) => {
const decrypt = (enc, iv, authTag) => {
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
decipher.setAuthTag(authTag);
let str = decipher.update(enc, 'base64', 'utf8');
str += decipher.final('utf8');
return str;
};
return {
decrypt,
};
};
const aesCipher = aes256gcm(key);
const decrypted_MobileNumber = aesCipher.decrypt(user.mobilenumber);
const decrypted_address = aesCipher.decrypt(user.address);
console.log('decrypted_MobileNumber',decrypted_MobileNumber)
console.log('decrypted_address',decrypted_address)
MobileNumber:'SM4XQJA2BMUWUUDEDW4ZQKZ3PT3QEQ5FBBTJ9HT4TGPQXTLMPYBSOQA836977J0RR3GYWG==',
这是您在加密过程中所做的操作:
Buffer.concat([Buffer.from(enc), iv, cipher.getAuthTag()]).toString("base64");
现在,您需要在解密过程中反向执行以下操作:
enc = Buffer.from(enc, "base64");
const iv = enc.slice(enc.length-32, enc.length-16);
const tag = enc.slice(enc.length-16);
enc = enc.slice(0, enc.length-32);
第二个问题是,GCM模式的nonce/iv应该是12字节长。我改变了这一点,所以上一期的一些指数也应该改变。
const crypto = require('crypto');
const aes256gcm = (key) => {
const encrypt = (str) => {
const iv = new crypto.randomBytes(12);
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
let enc1 = cipher.update(str, 'utf8');
let enc2 = cipher.final();
return Buffer.concat([enc1, enc2, iv, cipher.getAuthTag()]).toString("base64");
};
const decrypt = (enc) => {
enc = Buffer.from(enc, "base64");
const iv = enc.slice(enc.length - 28, enc.length - 16);
const tag = enc.slice(enc.length - 16);
enc = enc.slice(0, enc.length - 28);
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
decipher.setAuthTag(tag);
let str = decipher.update(enc, null, 'utf8');
str += decipher.final('utf8');
return str;
};
return {
encrypt,
decrypt,
};
};
const cipher = aes256gcm(Buffer.alloc(32)); // just a test key
const ct = cipher.encrypt('test');
const pt = cipher.decrypt(ct);
console.log(pt);
tag到底是什么意思?我们为什么需要它?
我希望有帮助,因为我不知道为什么我的AES-GCM实现中断了文件编码。 我有一个API使用1函数用AES-256-GCM加密/解密。(key=32个随机字节的缓冲区) 下面是函数: 使用这段代码,我对结果进行加密并写入文件: 最后,我解密并将内容写入一个文件:
节点模块: Java类:主要方法现在只是用于测试,稍后将被删除。
我试图创建一个应用程序在NodeJS(电子)作为一个跨平台桌面应用程序。这将与iOS上使用SWIFT开发的移动应用程序配对。作为共享数据的一部分,它使用AES-256-GCM算法进行加密。我在SWIFT中有以下加密和解密方法: 对于NodeJS,我有以下函数: null 下面是Java代码: 数据:这是数据 密钥:密码 根据我所读到的,Java将生成包含AuthTag的加密文本。我尝试将AuthT
我试着用java7实现AES-256-GCM解码,我在GCM中遇到了mac检查失败的响应,请帮帮我,谢谢大家。 我很期待Base64Encode的预期结果:DGVZDA==
问题内容: 这是我在Node.js中拥有的: 返回: 这就是我在Go中所拥有的: 最终返回 许多Go代码都来自https://gist.github.com/manishtpatel/8222606 我也尝试过此方法:如何在golang中解密在nodejs中加密的AES256位密码?(在这种情况下,无需进行一些修改),但会抛出错误 这是我尝试的代码: 我搜索了很多东西,但似乎无法弄清楚。 我究竟做