首页 >后端开发 >php教程 >如何安全地加密和解密 PHP 中的字符串?

如何安全地加密和解密 PHP 中的字符串?

Patricia Arquette
Patricia Arquette原创
2024-12-26 20:33:16449浏览

How Can I Encrypt and Decrypt Strings in PHP Securely?

如何加密和解密 PHP 字符串?

加密 PHP 字符串涉及使用密钥将原始字符串转换为加密格式或盐。解密字符串需要相同的密钥或盐来检索原始字符串。

加密过程

  1. 加密:加密原始字符串在 CTR(计数器模式)或 GCM(伽罗瓦/计数器)中使用安全算法,如 AES-256模式)。
  2. 身份验证:使用 HMAC-SHA-256 计算加密字符串的 MAC(消息身份验证代码)。将加密字符串与MAC结合,生成最终的加密结果。

解密过程

  1. 验证:重新计算加密结果的 MAC 并将其与包含的 MAC 进行比较。如果不同则中止。
  2. 解密: 使用正确的密钥解密加密字符串。

关键注意事项

  • 使用经过身份验证的加密算法(例如 AES-GCM、 ChaCha20-Poly1305) 用于加密和身份验证。
  • 利用 libsodium 或 defuse/php-encryption 等安全库来实现强大的加密和解密功能。​​
  • 由于潜在的安全风险,请避免使用自己的加密技术.
  • 使用 CSPRNG(加密安全)生成 IV(初始化向量)伪随机数生成器)如 random_bytes 或odium_randombytes。
  • 谨慎保护加密密钥。考虑使用密钥加密密钥或安全密钥管理系统。

使用 Libsodium 的示例:

<?php
use Sodium\Crypto;

function encrypt(string $message, string $key): string
{
    $nonce = random_bytes(Crypto::SECRETBOX_NONCEBYTES);
    $encrypted = Crypto::secretbox($message, $nonce, $key);
    return base64_encode($nonce . $encrypted);
}

function decrypt(string $encrypted, string $key): string
{
    $decoded = base64_decode($encrypted);
    $nonce = substr($decoded, 0, Crypto::SECRETBOX_NONCEBYTES);
    $ciphertext = substr($decoded, Crypto::SECRETBOX_NONCEBYTES);
    $decrypted = Crypto::secretbox_open($ciphertext, $nonce, $key);
    
    return $decrypted;
}

$message = 'Hello, world!';
$key = random_bytes(Crypto::SECRETBOX_KEYBYTES);
$encrypted = encrypt($message, $key);
$decrypted = decrypt($encrypted, $key);

var_dump($encrypted);
var_dump($decrypted);

以上是如何安全地加密和解密 PHP 中的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn