我用下面的代码加密了一个php应用程序中的一些数据:
base64_encode(openssl_encrypt(
$token,
static::ENCRYPTION_METHOD,
ApiReservationAlgorithmConfig::API_TOKEN_ENCRYPTION_KEY,
0,
hex2bin(ApiReservationAlgorithmConfig::API_TOKEN_INITIALIZATION_VECTOR)
));
我将请求头上的令牌发送到NodeJS API,并尝试使用加密来解密令牌。
const token = req.headers.authorization;
const encryptionKey = Buffer.from(API_TOKEN_ENCRYPTION_KEY, 'hex');
const initializationVector = Buffer.from(API_TOKEN_INITIALIZATION_VECTOR, 'hex');
const decipher = crypto.createDecipheriv('aes-256-cbc', encryptionKey, initializationVector);
decipher.setAutoPadding(false);
// const data = Buffer.from(token, 'base64');
// const str = data.toString();
let decrypted = decipher.update(Buffer.from(token, 'base64'));
decrypted = Buffer.concat([decrypted, decipher.final()]);
const plaintext = decrypted.toString('utf8');
我在两个应用程序中使用相同的密钥和矢量字符串,我已经硬编码用于测试目的和相同的加密算法aes-256-cbc。我正在努力解决这个问题一段时间,我在这里和其他博客上读到了很多线程,但我不能让它工作......我试过将自动填充设置为true和其他库,如forge或CryptoJS,但没有成功。我要么有一个空字符串,要么只是一个与我的初始编码数据无关的随机字符串。
我做错了什么,我该如何解决它?提前感谢您的任何建议!
1条答案
按热度按时间2uluyalo1#
要解密NodeJS中已在PHP中加密的数据:
1.验证您在NodeJS中接收的编码数据与您在PHP中加密的数据相同。您可以在PHP中打印编码数据,并将其与您在NodeJS中接收的数据进行比较。确保在传输过程中没有额外的字符或修改数据。
1.检查PHP和NodeJS中使用的编码格式。PHP的
base64_encode
函数可能使用与NodeJS的Buffer.from
函数不同的编码格式。确保您在PHP和NodeJS中使用相同的编码格式。1.验证您在NodeJS中使用的加密密钥和初始化向量的长度是否正确。对于
aes-256-cbc
,密钥长度应为256位(32字节),初始化向量长度应为128位(16字节)。如果这些值的长度不正确,则可能会得到错误的解密结果。1.验证您传递给解密函数的数据格式是否正确。在NodeJS代码中,您将Buffer对象传递给解密对象的update方法。请确保您传递的Buffer对象具有正确的格式和编码。
1.如果没有任何效果,请考虑使用与PHP和NodeJS兼容的第三方加密库,例如
libsodium
。