如何在不使用mcrypt的情况下用PHP解密ClickBank通知数据?
用OpenSSL替代Mcrypt解密ClickBank数据
没问题,我帮你把这套基于废弃mcrypt的代码改成PHP推荐的OpenSSL实现——毕竟mcrypt早就被移除了,用openssl不仅更安全,也是现在的标准做法。
首先先拆解一下原来mcrypt代码的核心逻辑,这样我们能精准替换:
- 用SHA1哈希你的密钥,取前32字节作为AES-256的密钥(因为
MCRYPT_RIJNDAEL_128搭配32字节密钥时,实际就是AES-256-CBC) - 对加密的通知内容和IV做Base64解码
- CBC模式解密后,移除开头的控制字符(\0到\32)
- 最后处理编码和转义得到JSON数据
下面是完全替代的代码,我会标注关键替换点:
$secretKey = "YOUR SECRET KEY"; // 你的ClickBank密钥 // 读取原始请求体的JSON $message = json_decode(file_get_contents('php://input')); // 提取加密的通知内容和IV $encrypted = $message->notification; $iv = $message->iv; error_log("IV: $iv"); // --- 核心解密部分替换为OpenSSL --- // 1. 生成AES-256密钥:SHA1哈希后取前32字节 $aesKey = substr(sha1($secretKey), 0, 32); // 2. 解码Base64的加密内容和IV $encryptedData = base64_decode($encrypted); $ivDecoded = base64_decode($iv); // 3. 用OpenSSL解密:指定aes-256-cbc算法,PKCS7填充(和原PKCS5兼容) $decrypted = openssl_decrypt( $encryptedData, 'aes-256-cbc', $aesKey, OPENSSL_RAW_DATA, // 对应mcrypt的原始输出模式 $ivDecoded ); // 4. 移除开头的控制字符,和原代码逻辑一致 $decrypted = trim($decrypted, "\0..\32"); // --- 解密部分结束 --- error_log("Decrypted: $decrypted"); // 处理编码和转义,转成JSON对象 $sanitizedData = utf8_encode(stripslashes($decrypted)); $order = json_decode($sanitizedData); // 修正原代码小问题:应该用处理后的$sanitizedData
关键说明:
- 算法匹配:原代码的
MCRYPT_RIJNDAEL_128搭配32字节密钥,等价于OpenSSL的aes-256-cbc——因为RIJNDAEL-128的块大小是128位,和AES一致,密钥长度决定了是128/192/256位AES。 - 填充兼容:原代码用的PKCS5Padding和OpenSSL默认的PKCS7Padding是兼容的(PKCS5是PKCS7的子集,块大小16字节时两者完全一样),所以不需要额外处理填充。
- 参数注意:
OPENSSL_RAW_DATA参数让openssl_decrypt返回原始二进制数据,和mcrypt_decrypt的输出一致,避免自动Base64编码。 - 小修正:原代码最后一行用未处理的
$decrypted解码JSON,这里改成了处理后的$sanitizedData,避免编码问题。
测试的时候可以对比两种方式的输出,确保解密结果完全一致——这套代码能完美替代原来的mcrypt实现,而且兼容所有支持openssl的PHP版本(PHP 5.6+就支持,现在主流PHP版本都满足)。
内容的提问来源于stack exchange,提问作者Tarek Adam
相关产品推荐
相关产品推荐

