当未指定任何内容时,CryptoJS如何获得IV
How does CryptoJS get an IV when none is specified?
当使用CryptoJS.AES.encrypt
时,如果没有将第三个参数传递给函数,它如何提出初始化向量?有没有办法把它从加密字符串中取出?
这个的原因是我需要解密使用 Lua 返回CryptoJS.AES.encrypt
的东西,但我只有提供的密钥。
CryptoJS的CryptoJS.<BlockCipher>.encrypt
有两种加密模式。
-
如果传入的密钥不是字符串,而是 WordArray(CryptoJS 的二进制数据内部表示格式),则密钥将按原样获取。此模式需要除 ECB 之外的所有操作模式的 IV,ECB 不使用 IV,因此您不必指定 IV。如果没有传递 IV,它将默认(通过一些 JavaScript 魔法)填充零的 IV(由 0x00 个字节的完整块组成)。
-
如果您传入一个字符串的"密钥",它将假定"密钥"是密码。为了从密码中派生密钥,它使用与OpenSSL兼容的派生函数
EVP_BytesToKey
。此模式生成一个新的 8 字节随机盐,并将其与密码一起使用以生成密钥和 IV。即使您显式传入 IV,也不会使用它。CryptoJS.AES.encrypt(msg, password).toString()
生成一个 Base64 编码的密文,该密文开头包含字符串"Salted__",后跟 8 字节盐和实际密文。您可以在使用前将其显式拆分为:
var ct = CryptoJS.AES.encrypt(msg, password); var saltHex = ct.salt.toString(); // random salt var ctHex = ct.ciphertext.toString(); // actual ciphertext var ivHex = ct.iv.toString(); // generated IV
如果需要重新创建相同的密钥派生。查看代码和规范。
密钥应该具有高熵,并且与随机噪声无法区分,这使得它们很难被暴力破解。上述
EVP_BytesToKey
并不安全,因为 MD5 哈希非常快,这使得攻击者能够暴力破解密码。您要么需要使用很长的密码(20-30个字符),要么使用适当的密钥派生函数,例如CryptoJS提供的PBKDF2。
- 如何在下面的ES6循环中获得前面的文本
- 我可以获得相对于被点击元素的确切点击位置吗
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 当我点击jsf中的primefaces命令按钮时,如何获得点击事件
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- 如何在javascript中获得与特定数字相等的随机数
- 在Highcharts中,我们可以通过任何方式在渲染图表之前获得plotWidth和plotHeight
- 我的shareService在angular 2中发送值工作正常,但当我渲染我的另一个组件时,会获得默认值
- 我怎样才能获得承诺的价值
- 检查元素是如何获得焦点的
- javascript处理一个对象数组以获得一个新的对象数组
- 如何更改<选择>使用angularJS从控制器获得的值
- CryptoJS和密钥/IV长度
- Highcharts-如何在自定义格式化程序中获得默认的y轴标签格式化程序
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- 有没有一种方法可以获得three.js的最小/lite版本
- 如何在JS中获得CryptoJS.HmacSHA256的摘要表示
- 如何使用SHA256使用PHP和CryptoJS获得相同的结果
- 当未指定任何内容时,CryptoJS如何获得IV