首頁 > 後端開發 > php教程 > 如何使用 libsodium 安全地加密和解密 PHP 字串?

如何使用 libsodium 安全地加密和解密 PHP 字串?

Patricia Arquette
發布: 2024-12-18 03:00:10
原創
919 人瀏覽過

How to Securely Encrypt and Decrypt PHP Strings Using libsodium?

如何加密和解密 PHP 字串

在討論加密時,區分加密和身份驗證非常重要。通常,首選將加密與訊息驗證碼 (MAC) 結合的驗證加密。為了確保安全,強烈建議避免實現自己的加密技術,而是依賴由加密專家開發和審查的完善的程式庫。

使用libsodium 的加密步驟:

  1. 在CTR 模式下使用AES 加密訊息或使用處理驗證的GCM
  2. 使用HMAC -SHA-256 驗證密文,確保MAC 涵蓋IV 和密文。

使用 libsodium 的解密步驟:

  1. 根據收到的密文驗證 MAC 蘋果。如果驗證失敗,則中止,表示資料損壞。
  2. 使用經過驗證的加密方法解密訊息。

其他注意事項:

  • 避免在加密之前壓縮任何內容。
  • 使用適當的字串運算子集。
  • 使用加密安全偽隨機數產生器 (CSPRNG) 安全地產生 IV。
  • 始終在 MAC 之前執行加密以防止漏洞。
  • 了解潛在資訊某些編碼方法的洩漏問題。

範例程式碼鈉:

<?php
declare(strict_types=1);

/**
 * Encrypt a message
 * 
 * @param string $message - message to encrypt
 * @param string $key - encryption key
 * @return string
 * @throws RangeException
 */
function safeEncrypt(string $message, string $key): string
{
    if (mb_strlen($key, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
        throw new RangeException('Key is not the correct size (must be 32 bytes).');
    }
    $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
    
    $cipher = base64_encode(
        $nonce.
        sodium_crypto_secretbox(
            $message,
            $nonce,
            $key
        )
    );
    sodium_memzero($message);
    sodium_memzero($key);
    return $cipher;
}

/**
 * Decrypt a message
 * 
 * @param string $encrypted - message encrypted with safeEncrypt()
 * @param string $key - encryption key
 * @return string
 * @throws Exception
 */
function safeDecrypt(string $encrypted, string $key): string
{   
    $decoded = base64_decode($encrypted);
    $nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
    $ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');
    
    $plain = sodium_crypto_secretbox_open(
        $ciphertext,
        $nonce,
        $key
    );
    if (!is_string($plain)) {
        throw new Exception('Invalid MAC');
    }
    sodium_memzero($ciphertext);
    sodium_memzero($key);
    return $plain;
}
?>
登入後複製

以上是如何使用 libsodium 安全地加密和解密 PHP 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板