【发布时间】:2021-01-30 13:29:23
【问题描述】:
我目前正在对我的 API 实施加密。我必须以与在 PHP 编写的特定脚本中加密和解密相同的方式实现这一点。
当我将结果输出为base64 时,一切正常。 PHP 解密方法针对它运行并且工作得很好。问题是,由于某些要求,我需要输出的不是base64而是二进制,但是当我从Nodejs端加密成二进制时,结果与我在PHP中加密成二进制时的结果不同,但它应该是相同的。
PHP 加密:
function vd_encrypt($plaintext, $password) {
$method = "AES-256-CBC";
$key = hash('sha256', $password, true);
$iv = openssl_random_pseudo_bytes(16);
$ciphertext = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);
$hash = hash_hmac('sha256', $ciphertext, $key, true);
return $iv . $hash . $ciphertext;
}
Javascript 加密:
import crypto from 'crypto';
export function encrypt (plain_text: string): string {
const encryptionMethod = 'AES-256-CBC';
const iv = crypto.randomBytes(IV_LENGTH);
const key = crypto.createHash("sha256").update(secret).digest();
var encryptor = crypto.createCipheriv(encryptionMethod, key, iv);
const result = iv + encryptor.update(plain_text, 'utf8', 'binary') + encryptor.final('binary');
return result;
}
【问题讨论】:
-
您为什么期望输出“相同”?它们不能相等,因为您使用的是(coorectly)随机 iv,它们必须有所不同。其次 - PHP 代码正在计算您的 node.js 代码中缺少的身份验证值(“HMAC”)。
标签: php node.js encryption binary base64