PHP5.6 AES加密代码升级适配PHP7.3及PHP加密学习咨询
PHP 5.6 AES加密代码升级PHP7.3适配方案及学习建议
核心适配说明
PHP 7.1起已废弃mcrypt扩展,PHP7.3版本已完全移除该扩展,原有加密逻辑需替换为官方推荐的openssl扩展实现,适配时保持原有加密逻辑、输出结果完全兼容。
适配后完整代码
function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for($i = 0; $i < $length; $i++) { // 替换rand为PHP7+支持的加密安全随机数生成器 $randomString .= $characters[random_int(0, $charactersLength - 1)]; } return $randomString; } // 原有逻辑保持兼容,也可直接替换为strtoupper(bin2hex($string))实现同等效果,执行效率更高 function strToHex($string) { $hex = ''; for($i = 0; $i < strlen($string); $i++) { $ord = ord($string[$i]); $hexCode = dechex($ord); $hex .= substr('0' . $hexCode, -2); } return strToUpper($hex); } function AESencrypt($decrypted, $password = 'password', $salt = 'salt_key') { $block = 16; // AES-128块大小固定为16字节,替代废弃的mcrypt_get_block_size $padding = $block - (strlen($decrypted) % $block); $decrypted .= str_repeat(chr($padding), $padding); // 替换废弃的mcrypt_encrypt为openssl_encrypt,参数对齐原有逻辑保证加密结果一致 $encrypted = base64_encode(openssl_encrypt($decrypted, 'AES-128-CBC', $password, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $password)); $encrypted = hash('SHA256', $encrypted . '|' . $salt, true); return strToHex($encrypted); } $agentid = "EU01EU22INB000"; $mercode = "BPP"; $username = "BPP_01"; $userpass = "BPP_01"; $storecode = "BPP_01"; $ipaddr = "103.235.104.168"; $billerid = '00000NATTQ'; $bbpstel = 'QH01WD3737'; $bbpstel1 = $bbpstel; $stringParts = str_split($bbpstel1); sort($stringParts); $sortval = implode('', $stringParts); $sort = $sortval; $Billfetch = "BillPay" . generateRandomString(); $hashkey = AESencrypt($Billfetch . "|" . $mercode . "|" . $agentid . "|" . $billerid . "|" . $sort, "password", "salt_key"); echo $Billfetch."----".$hashkey."<br/>"; exit;
PHP加密相关学习建议
- 优先掌握openssl扩展:PHP7+官方唯一推荐的加密扩展,覆盖对称加密、非对称加密、哈希计算、签名验签等全场景,无需依赖第三方或已废弃扩展
- 理清基础加密概念:掌握AES加密的模式(CBC/ECB/GCM等)、块大小、密钥长度、IV向量作用、填充规则(PKCS7/ZeroPadding等)、哈希算法特性,避免乱用参数导致加密不安全
- 兼容性对齐规则:不同版本、不同语言加密互通的核心是算法、密钥、IV、填充方式、输出编码(base64/hex/二进制)五个参数完全一致,适配时逐一核对即可避免加密结果不一致的问题
- 安全最佳实践:不要硬编码密钥、盐到业务代码;IV需随机生成并和密文一起存储传输;加密场景不要用弱随机数生成器(如rand()仅适合业务随机场景);敏感数据优先用AEAD模式(如AES-GCM)同时完成加密和完整性校验
- 哈希使用规范:密码存储不要用普通哈希,要用
password_hash()/password_verify()专用函数;完整性校验优先选HMAC而非自行拼接盐做哈希,避免长度扩展攻击
内容的提问来源于stack exchange,提问作者Chirag Pipariya
相关产品推荐
相关产品推荐

