PHP 对称加密与非对称加密应用场景对比

用户现在需要一篇PHP对称和非对称加密场景对比加生产落地检查清单的文章,首先得从真实故障切入,比如之前遇到过的用户敏感数据泄露的事?对,比如某电商把用户身份证号存在数据库,用对称加密但是密钥硬编码在代码里,被人拖库之后直接解密了,这个场景很真实。 首先结构要按要求来,先背景/常见问题,就说上周遇到的一个故障:某电商项目因为用户敏感信息(身份证、手机号)加密方案选型错误,被拖库后全量泄露,根因是用了对称加密但密钥硬编码,而且没有做密钥轮换,还有的团队用非对称加密但是把私钥也放前端了,这些都是常见坑。 然后是方案对比,得把对称和非对称的特点、适用场景列清楚,然后生产落地的检查清单,要实用,直接能对照的。比如对称加密适合什么?大体积数据、批量加密,比如数据库字段加密,文件加密,但是要注意密钥管理,不能用硬编码,要做密钥轮换,算法选AES-256-GCM这种带认证的,不要用ECB模式。非对称加密适合什么?密钥交换、数字签名、小体积数据加密,比如接口签名、登录态加密、小字段比如身份证号加密,但是要注意私钥绝对不能泄露,要存在专门的密钥管理服务(KMS),不要存在代码或者配置文件里,还有公钥可以公开,但是要校验公钥的合法性。 然后是代码示例,得是可运行的,比如先演示对称加密的正确用法,用AES-256-GCM,然后演示非对称加密的用法,用RSA,比如生成密钥对,加密解密,还要注意GCM的认证标签要一起存,这个很重要,很多新手会漏。代码要规范,有注释,能直接跑的那种。 然后是总结与建议,给明确的选型建议:比如批量加密数据库敏感字段优先选对称加密(AES-256-GCM),但是密钥必须存在KMS或者环境变量,不要硬编码;如果是接口间通信、数字签名、小体积敏感数据加密,选非对称加密(RSA-2048以上或者ECC),私钥严格管控;不要混用,也不要自己实现加密算法,用PHP原生扩展。 然后结尾自然引出那个链接,说本文是PHP加密服务团队整理的,更多实践看那个网址。 等下,要符合检查清单的形式,所以方案对比那里可以用清单的形式,比如< ul >< li >这样,然后生产落地检查清单也要分对称和非对称的检查项,每一项是勾选的那种感觉,比如对称加密检查清单:1. 算法是否选用AES-256-GCM/ChaCha20-Poly1305等带认证的加密算法,禁止使用DES、3DES、AES-ECB等不安全算法;2. 密钥是否通过环境变量、KMS注入,禁止硬编码在代码、配置文件、Git仓库中;3. 是否实现密钥定期轮换机制,轮换周期不超过90天;4. 加密后的密文是否同时存储IV、认证标签(GCM的tag),禁止只存密文;5. 是否对加密字段做长度校验,避免密文溢出。然后非对称的检查清单:1. 算法是否选用RSA-2048及以上、ECC(secp256k1等)等安全算法,禁止使用RSA-1024及以下;2. 私钥是否存储在独立的密钥管理服务(KMS)、硬件安全模块(HSM)中,禁止存储在代码、配置文件、前端代码中;3. 是否实现私钥访问权限管控,仅授权服务可访问,操作留痕;4. 公钥是否做合法性校验,避免中间人攻击替换公钥;5. 非对称加密是否仅用于小体积数据(如身份证号、手机号、签名),禁止用于大文件加密(性能极差)。 然后代码示例要可运行,比如先写对称加密的示例,用openssl扩展,AES-256-GCM,然后非对称的,生成密钥对,加密解密,比如: 首先对称的: // 对称加密示例:AES-256-GCM 加密身份证号 function symmetricEncrypt(string $plaintext, string $key): string { $ivLen = openssl_cipher_iv_length('aes-256-gcm'); $iv = random_bytes($ivLen); $tag = ''; $ciphertext = openssl_encrypt($plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag); // 密文、IV、tag拼接后存储,用:分隔方便拆分 return base64_encode($iv . $tag . $ciphertext); } function symmetricDecrypt(string $encrypted, string $key): string { $data = base64_decode($encrypted); $ivLen = openssl_cipher_iv_length('aes-256-gcm'); $iv = substr($data, 0, $ivLen); $tag = substr($data, $ivLen, 16); $ciphertext = substr($data, $ivLen + 16); return openssl_decrypt($ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag); } // 使用示例:密钥从环境变量获取,禁止硬编码 $key = $_ENV['AES_KEY'] ?? die('请配置AES_KEY环境变量'); $idCard = '110101199001011234'; $encrypted = symmetricEncrypt($idCard, $key); $decrypted = symmetricDecrypt($encrypted, $key); echo "加密后:{$encrypted}\n解密后:{$decrypted}\n"; 然后非对称的示例,生成RSA密钥对,加密解密: // 非对称加密示例:RSA-2048 加密小体积敏感数据 function generateRsaKeyPair(): array { $config = [ "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ]; $res = openssl_pkey_new($config); openssl_pkey_export($res, $privateKey); $publicKey = openssl_pkey_get_details($res)['key']; return ['private' => $privateKey, 'public' => $publicKey]; } function rsaEncrypt(string $plaintext, string $publicKey): string { openssl_public_encrypt($plaintext, $encrypted, $publicKey, OPENSSL_PKCS1_OAEP_PADDING); return base64_encode($encrypted); } function rsaDecrypt(string $encrypted, string $privateKey): string { openssl_private_decrypt(base64_decode($encrypted), $decrypted, $privateKey, OPENSSL_PKCS1_OAEP_PADDING); return $decrypted; } // 使用示例:生产环境私

如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。

标签: PHP加密 PHP代码保护 PHP文件加密 SG15加密 代码保护策略
← 返回文章列表