ホームページ > バックエンド開発 > PHPチュートリアル > libsodium を使用して PHP 文字列を安全に暗号化および復号化する方法

libsodium を使用して PHP 文字列を安全に暗号化および復号化する方法

Patricia Arquette
リリース: 2024-12-18 03:00:10
オリジナル
926 人が閲覧しました

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 を確認します。受信した MAC に対する暗号文。検証が失敗し、データの破損が示された場合は中止します。
  2. 認証された暗号化方式を使用してメッセージを復号化します。

追加の考慮事項:

  • 暗号化の前に圧縮することは避けてください。
  • 適切な文字列操作を使用してください。拡張文字セットを処理する関数。
  • 暗号的に安全な擬似乱数生成器 (CSPRNG) を使用して IV を安全に生成します。
  • 脆弱性を防ぐために、MAC の前に常に暗号化を実行します。
  • 注意してください特定のエンコーディングで発生する可能性のある情報漏洩の問題メソッド。

libsodium を使用したコード例:

<?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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート