We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
由于 nodejs 里的 crypto 里的各类加密方法是黑盒的,仅暴露了数个配置项,例如 createCipheriv
createCipheriv
/** algoritihm 即加密算法 key 即秘钥 iv 即初始化向量 **/ crypto.createCipheriv(algorithm, key, iv);
其实如果是用 nodejs 进行加解密是非常简单的,但这次是与客户端对接,node 加密,c++ 解密,两端的默认配置项都有参数的不一致,就需要详细的了解这里面加密算法的所有配置项。
注意:
1、如果用 createCipher 会发现 nodejs 生成的加密内容,大部分语言都无法解密,这是因为其他语言的库基本都是带 iv 的,不带 iv 的安全性比较低,容易被暴力破解。后续 createCipher 是会被 createCipheriv 给取代的,具体的参考 此处
createCipher
2、秘钥的 bit 位数要与加密块长度一致,例如 aes-128-ecb,即需要使用 16 个字节的秘钥
相对于其他加密算法,aes 有非常多不同模式的加密
每个模式的 iv 不同,padding 不同,这两个就是造成与客户端对接的难点,官方文档里没有指出此方法默认的 iv 和 padding
padding 是用来填充加密数据最后一块内容,使得变成一整块,对于加密解密需要使用同一的 padding。可是从上面的方法来看并没有自定义设置 padding 的选项,仅找到:
cipher.setAutoPadding([autoPadding])
当使用块加密算法时,Cipher类会自动添加padding到输入数据中,来适配相应块大小。可调用cipher.setAutoPadding(false)禁用默认padding。当autoPadding是false时,整个输入数据的长度必须是cipher块大小的倍数,否则cipher.final()将抛出一个错误。
这个方法一般用来保证输入内容的长度
遇到的第一坑就是,无论我输入 iv 的长度为多少,都会被告知 invalid iv length
其实 ecb 模式下的加密,iv 就只能是空串,不能是其他的
其次遇到的问题是,加密后端的内容默认会多一些(16)字节,这些字节其实就是 padding,但是 nodejs 文档里并没提到关于 aes-256-ecb 实现 padding 是多少。
后面经过多次尝试,发现默认 padding 为 PKCS_PADDING(PKCS5Padding)
PKCS_PADDING(PKCS5Padding)
后续查找了一些文档,发现各模式的 padding 选项:
可以发现如果某个块不满 16 字节,默认是会帮我们填充至 16 字节,如果恰好每个块都是 16 字节,则默认在末尾增加 16 字节 padding。
这幅图来自参考链接 2,其中文章里说:
node.js语言本身默认不补全填充量
根据测试,如今的 nodejs 默认是会填充 padding 的,也就是前面说的 setAutoPadding 默认为 true
1、理解AES加密解密的使用方法 2、node.js AES/ECB/PKCS5Padding 与其他语言的加密解密通用
The text was updated successfully, but these errors were encountered:
No branches or pull requests
由于 nodejs 里的 crypto 里的各类加密方法是黑盒的,仅暴露了数个配置项,例如
createCipheriv
其实如果是用 nodejs 进行加解密是非常简单的,但这次是与客户端对接,node 加密,c++ 解密,两端的默认配置项都有参数的不一致,就需要详细的了解这里面加密算法的所有配置项。
注意:
1、如果用
createCipher
会发现 nodejs 生成的加密内容,大部分语言都无法解密,这是因为其他语言的库基本都是带 iv 的,不带 iv 的安全性比较低,容易被暴力破解。后续 createCipher 是会被 createCipheriv 给取代的,具体的参考 此处2、秘钥的 bit 位数要与加密块长度一致,例如 aes-128-ecb,即需要使用 16 个字节的秘钥
aes 加密
相对于其他加密算法,aes 有非常多不同模式的加密
每个模式的 iv 不同,padding 不同,这两个就是造成与客户端对接的难点,官方文档里没有指出此方法默认的 iv 和 padding
padding
padding 是用来填充加密数据最后一块内容,使得变成一整块,对于加密解密需要使用同一的 padding。可是从上面的方法来看并没有自定义设置 padding 的选项,仅找到:
这个方法一般用来保证输入内容的长度
aes-ecb 无需 iv
遇到的第一坑就是,无论我输入 iv 的长度为多少,都会被告知 invalid iv length
其实 ecb 模式下的加密,iv 就只能是空串,不能是其他的
ecb 的默认 padding
其次遇到的问题是,加密后端的内容默认会多一些(16)字节,这些字节其实就是 padding,但是 nodejs 文档里并没提到关于 aes-256-ecb 实现 padding 是多少。
后面经过多次尝试,发现默认 padding 为
PKCS_PADDING(PKCS5Padding)
后续查找了一些文档,发现各模式的 padding 选项:
可以发现如果某个块不满 16 字节,默认是会帮我们填充至 16 字节,如果恰好每个块都是 16 字节,则默认在末尾增加 16 字节 padding。
这幅图来自参考链接 2,其中文章里说:
根据测试,如今的 nodejs 默认是会填充 padding 的,也就是前面说的 setAutoPadding 默认为 true
参考
1、理解AES加密解密的使用方法
2、node.js AES/ECB/PKCS5Padding 与其他语言的加密解密通用
The text was updated successfully, but these errors were encountered: