【发布时间】:2021-04-22 18:01:46
【问题描述】:
我正在尝试根据 PHP 中给出的一个示例代码创建一个加密字符串,我的主要问题是 Node.js crypto 模块不接受长度超过 32 个字节的密钥,但 PHP openssl_encrypt确实如此,看来这就是我收到Invalid key size error 的原因。
这是我的js代码:
let iv = sha1(await HelpersService.makeRandomNumber(null, null, 16));
iv = iv.substr(0, 16);
const text = bundledData;
const password = sha1(this.credentials.appSecret);
let salt = sha1(await HelpersService.makeRandomNumber(null, null, 4));
salt = salt.substr(0, 4);
const key = crypto.createHash('sha256').update(password + salt).digest('hex');
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encoded = cipher.update(text, 'utf8', 'hex');
encoded += cipher.final('hex');
这是 PHP 示例:
function generateCashOutAPIHashKey($app_secret ){
//remove plus(+) sign from gsm number.
$data = 'text';
$iv = substr(sha1(mt_rand()), 0, 16);
$password = sha1($app_secret);
$salt = substr(sha1(mt_rand()), 0, 4);
$saltWithPassword = hash('sha256', $password . $salt);
$encrypted = openssl_encrypt("$data", 'aes-256-cbc', "$saltWithPassword", null, $iv );
return $encrypted;
}
【问题讨论】:
-
可能无关紧要的小点 当像
openssl_encrypt("$data",这样作为参数传递时,您不需要将变量放在引号中,一个简单的openssl_encrypt($data,就足够了 -
PHP 根据指定的算法隐式截断密钥长度,即 AES-256 为 32 字节。 NodeJS 代码的 crypto 模块不会自动执行此操作,因此必须使用
substr(0, 32)显式截断密钥。此外,PHP 代码返回 Base64 编码的密文,即在 NodeJS 代码中,输出编码必须在update()和final()调用中从'hex'更改为'base64'。 -
@Topaco 非常感谢!现在好了。可以发一下吗,我会把它标记为答案
-
不客气。我将其发布为答案。
标签: php node.js openssl cryptography