java secretkey用法_Node.js加密密钥和iv匹配java SecretKeySpec / IvParameterSpec

假设您具有与Java代码相同的密码字符串,则可以在节点中创建如下的密钥缓冲区:

var key = new Buffer(password, "utf8");

由于你在Java中使用零填充IV(坏!),这是节点中的等效代码:

var iv = new Buffer(16); // 16 byte buffer with random data

iv.fill(0); // fill with zeros

由于您在Java中使用CBC模式,因此必须在节点中执行相同操作.请注意,根据您的“密码”长度选择密码字符串时,您必须选择正确的密钥大小:

var aesCipher = mCrypto.createCipheriv("aes-128-cbc", key, iv);

// or

var aesCipher = mCrypto.createCipheriv("aes-192-cbc", key, iv);

// or

var aesCipher = mCrypto.createCipheriv("aes-256-cbc", key, iv);

Node将自动应用PKCS#7填充,这与AES的PKCS#5填充相同.

密码不是关键!

密码通常没有用作密钥的适当长度(AES的有效长度为16字节,24字节和32字节)并且它仅包含可打印字符,这可能使攻击者更容易强制密钥.

从密码创建密钥所需的是密钥派生功能.流行的是PBKDF2,bcrypt和scrypt(成本增加).

随机四!

你真的应该为你生成的每个密文生成一个新的随机IV.如果您使用静态IV,则观察您的密文的攻击者可以确定您发送了相同甚至类似的消息.如果你使用随机IV,那么密文差别很大,攻击者无法确定是否有两个不同的密文是从同一个明文创建的.这称为语义安全性.

随机IV本身不必是秘密的,因此您可以轻松地将其添加到密文并在解密之前将其切片.

您甚至可以将其与密钥派生函数(KDF)结合使用.只需为KDF生成随机盐. KDF通常能够导出可变数量的输出字节,因此只需让它派生密钥|| IV(连接)然后拆分它们.现在,您只需要将salt添加到密文中.

验证!

根据您的系统,您可能容易受到padding oracle攻击等攻击.对此的最好防御是验证密文.因此,您可以使用具有强MAC的加密 – 然后MAC方案(如HMAC-SHA256)或经过身份验证的操作模式(如GCM或EAX). Java和节点都支持GCM,但还有一些工作要做.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值