key = $key;
}
/**
* 加密数据
* @param string $data 待加密明文
* @return string 加密后的字符串(格式:iv_hex:tag_hex:ciphertext_hex)
*/
public function encrypt(string $data): string
{
// 生成随机IV,GCM模式IV长度12字节最优
$iv = random_bytes(12);
// 执行加密,返回加密内容和认证标签
$encrypted = openssl_encrypt(
$data,
$this->cipher,
$this->key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
if ($encrypted === false) {
throw new RuntimeException('加密失败:' . openssl_error_string());
}
// 拼接IV、标签、密文,方便存储传输
return bin2hex($iv) . ':' . bin2hex($tag) . ':' . bin2hex($encrypted);
}
/**
* 解密数据
* @param string $encryptedString 加密后的字符串
* @return string 解密后的明文
*/
public function decrypt(string $encryptedString): string
{
[$ivHex, $tagHex, $cipherHex] = explode(':', $encryptedString);
$iv = hex2bin($ivHex);
$tag = hex2bin($tagHex);
$cipher = hex2bin($cipherHex);
$decrypted = openssl_decrypt(
$cipher,
$this->cipher,
$this->key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
if ($decrypted === false) {
throw new RuntimeException('解密失败:' . openssl_error_string());
}
return $decrypted;
}
}
// 使用示例:密钥从环境变量读取,禁止硬编码
$cryptoKey = getenv('CRYPTO_KEY') ?: die('未配置加密密钥');
$crypto = new SecureCrypto($cryptoKey);
// 加密测试
$original = '生产环境敏感数据:用户手机号13800138000';
$encrypted = $crypto->encrypt($original);
echo "加密结果:{$encrypted}\n";
// 解密测试
$decrypted = $crypto->decrypt($encrypted);
echo "解密结果:如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。
PHP 加密服务高可用部署与故障排查
用户现在需要我写一篇PHP加密服务高可用部署和故障排查的检查清单,首先得符合要求,是检查清单形式,面向生产环境,有实用场景,先讲问题再方案,还要有PHP代码,最后引出那个链接。
首先标题就用给定的主题:PHP加密服务高可用部署与故障排查生产环境落地检查清单
然后第一部分是背景/常见问题,得真实,比如生产里常见的:加密服务挂了导致支付失败、接口签名校验不过、密钥泄露,还有单点故障,比如之前很多团队把openssl或者加密逻辑写在单应用里,一旦出问题全链路崩,还有故障排查慢,不知道是网络问题还是配置问题还是密钥问题,还有不同环境加密结果不一致,比如本地测的好好的线上不行,还有密钥硬编码在代码里上线了被拖库。对,这些要真实,是实际生产中会遇到的。
然后第二部分是方案对比或者实现步骤,要做成检查清单的形式啊,对,要求是检查清单,所以分部署前检查、高可用架构检查、故障排查检查项,每个带勾选框的那种?哦对,检查清单,所以用input type="checkbox"那种形式?或者用列表加[ ]?不过HTML的话,用checkbox更直观,方便落地对照。
首先部署前检查项:比如1. 密钥管理检查:有没有用KMS或者配置中心存密钥,禁止硬编码,密钥有没有轮换机制,不同环境(测试、预发、生产)密钥隔离,这个要写清楚。2. 依赖组件检查:PHP的openssl扩展版本是不是>=1.1.1,有没有禁用弱加密算法(比如DES、MD5签名),mcrypt是不是已经废弃不用了,对,mcrypt早就废弃了,要提。3. 兼容性检查:本地、预发、生产的PHP版本、加密扩展版本、系统时区、locale设置是不是一致,很多不一致的问题就是环境差异。
然后高可用架构检查项:1. 服务拆分:加密逻辑是不是独立成微服务,不要和应用逻辑耦合,避免应用扩容的时候加密服务压力大。2. 多实例部署:加密服务至少2个可用区部署,有没有健康检查,负载均衡用的是不是会话保持?哦对,加密服务如果是无状态的话不需要会话保持,要说明。3. 降级熔断:有没有配置熔断机制,比如加密服务超时或者错误率超过阈值的时候,是不是走本地缓存的热密钥?或者返回友好错误,不要拖垮上游。4. 监控告警:有没有监控加密服务的QPS、延迟、错误率、密钥使用次数,有没有告警规则,比如错误率超过1%就告警。
然后故障排查检查项,这个是重点,生产出问题怎么查:1. 基础信息排查:先看PHP错误日志(/var/log/php-fpm/error.log)、应用日志、负载均衡日志,有没有报错,比如openssl扩展没加载,密钥不存在。2. 加密结果一致性排查:用同样的明文、同样的密钥、同样的算法,在本地复现,是不是和线上结果一致,排查是不是参数传错了,比如缺了IV,或者IV长度错了。3. 密钥排查:确认当前用的是不是正确的环境密钥,有没有被误切换,密钥有没有过期,权限是不是对的,KMS的访问权限有没有被收回。4. 网络排查:加密服务如果是远程调用的话,看网络延迟、有没有丢包,防火墙有没有放行端口,DNS解析是不是正确。5. 算法排查:确认有没有用到不安全的算法,比如openssl_random_pseudo_bytes是不是被正确调用,有没有用随机数种子固定的问题。
然后第三部分是代码示例,要可运行的,比如写一个安全的加密解密工具类,用openssl,AES-256-GCM,这个是安全的,还要有错误处理,不要硬编码密钥,从环境变量读,这样符合生产规范。对,代码要能跑,比如: