如何解决使用 Crypto 将带有 md5 的 PHP openssl_encrypt 转换为 NodeJS
我在 PHP 中有此代码(无法修改)
<?php
$myPlain = "123456789012345678900000";
$myKey = md5($myPlain,true);
$myKey .= substr($myKey,8);
$encrypted = openssl_encrypt($myPlain,'des-ede3',$myKey,OPENSSL_RAW_DATA);
print(base64_encode($encrypted));
此代码返回
FTYDrZTZMjVBv5Fk/xcfFxJASaizzrmoPts7fGDvWjc=
当我尝试在 NodeJS 中复制此内容时
function testEde3(myKey,myPlain) {
try {
let md5Key = crypto.createHash('md5').update(myKey,'utf-8').digest("base64").substr(0,24);
console.log(md5Key); //outputs 4o1aJrSWN3bSfjuIX6VXgA==
console.log(md5Key.length); //outputs 24
const cipher = crypto.createCipheriv('des-ede3',md5Key,null);
let encrypted = cipher.update(myPlain,'utf8','base64');
encrypted += cipher.final('base64');
return encrypted;
} catch ( ex ) {
return ex;
}
}
const myKey = "123456789012345678900000";
const myPlain = "123456789012345678900000";
const hash = testEd3(myKey,myPlain);
console.log(`Hash is: ${hash}`);
输出是
Hash is: lDQX9OGsopKOt6P9WQwekGsKDQGFpfGW50zbs3HrOfQ=
我认为问题出在 MD5 上。如果我尝试在没有 md5 的情况下加密,结果是一样的。
谢谢
解决方法
Php 代码中的密钥由 MD5 哈希的 16 个字节组成,其中附加了 MD5 哈希的前 8 个字节,从而产生了 24 个字节的密钥(如 3DES 所要求的)。这目前没有在 NodeJS 代码中实现,但可以实现,例如作者:
let md5Key = crypto.createHash('md5').update(myKey,'utf-8').digest();
md5Key = Buffer.concat([md5Key,md5Key.slice(0,8)]);
随着这个变化,NodeJS 代码生成了具有相同输入数据的 PHP 代码的密文。
des-ede3
表示 ECB 模式下的 3DES。请注意,3DES 已过时且速度缓慢,应由 AES 替换。 ECB 模式通常是不安全的。加密密钥也没什么意义(但可能仅用于测试目的)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。