【发布时间】:2020-10-15 20:39:25
【问题描述】:
我想在 ReactJS 应用程序中实现一个 PhP 加密功能。我需要以使用 OpenSSL 库函数 (openssl_encrypt) 创建的特定格式发送令牌。
与 JAVASCRIPT 函数相比,PHP 函数生成的字符串要短一些。当然,两者都获得相同的属性和属性。
PHP:
protected static function encrypt($stringData) {
$encrypted = false;
$encrypt_method = 'AES-256-CBC';
$iv = substr(hash('sha256', static::$ivMessage), 0, 16);
$encrypted= openssl_encrypt($stringData, $encrypt_method, static::$apiSecret, 0, $iv);
return $encrypted;
}
JAVASCRIPT:
export const encrypt = (stringData) => {
const iv = CryptoJS.SHA256(IV_MESSAGE).toString(CryptoJS.enc.Hex).substring(0, 16);
const encrypted = CryptoJS.AES.encrypt(stringData, API_SECRET, {
iv,
mode: CryptoJS.mode.CBC,
pad: CryptoJS.pad.ZeroPadding,
});
return encrypted;
};
示例常量:
const stringData = "{"uid":19,"price":10000000,"duration":240,"credit_purpose":5,"new_tab":false,"cssFile":"kalkulatorok","css":[],"supported":false,"email":"test@test.hu","productType":"home_loan","method":"calculator","calculatorType":"calculator","unique":true}";
const IV_MESSAGE = "a";
const API_SECRET = "secret_key";
(PHP 函数也一样 --> $stringData, $ivMessage; $apiSecret)
如何实现在 JAVASCRIPT 中“复制”PHP 函数?到目前为止我错过了什么?
【问题讨论】:
-
语言名称是 PHP - 全部大写。
-
PHP/openssl 使用 PKCS#7 作为填充模式,您的 Javascript 函数使用 ZeroPadding - 我相信将其中一个更改为相同模式时,您会收到相同的结果。展示一整套示例数据(密钥/apisecret、iv_message、明文、加密数据)可能是个好主意。
-
密钥(
API_SECRET)必须以CryptoJS.AES.encrypt()作为WordArray传入,目前是字符串,所以CryptoJS隐式使用了密钥推导函数。这同样适用于 IV (iv)。顺便说一句,CBC和PKCS7是默认的。 -
@ArtjomB。不幸的是,情况并非如此:
const iv = CryptoJS.SHA256('a').toString(CryptoJS.enc.Hex).substring(0, 16); console.log(iv);结果:ca978112ca1bbdca$iv = substr(hash('sha256', 'a'), 0, 16); echo $iv;结果:ca978112ca1bbdca -
@MichaelFehr 将填充更改为 CryptoJS.pad.Pkcs7 但仍然没有成功。
标签: javascript php encryption openssl cryptography