ホームページ > バックエンド開発 > PHPチュートリアル > Libsodium または defuse/php-encryption を使用して PHP 文字列を安全に暗号化および復号化する方法は?

Libsodium または defuse/php-encryption を使用して PHP 文字列を安全に暗号化および復号化する方法は?

Mary-Kate Olsen
リリース: 2024-12-18 00:26:10
オリジナル
120 人が閲覧しました

How to Securely Encrypt and Decrypt PHP Strings Using Libsodium or defuse/php-encryption?

PHP 文字列の暗号化と復号化

質問:
PHP 文字列を暗号化および復号化するにはどうすればよいですか。元の文字列と両方のソルトまたはキーの両方が必要ですプロセス?

答え:
続行する前に、暗号化と認証の違いを理解することが重要です。堅牢なセキュリティを確保するには、暗号化してから認証する暗号化認証をお勧めします。

独自の暗号を作成することは避けてください。代わりに、暗号化の専門家によって開発された信頼できるライブラリを利用してください。使いやすさと組み込みの認証暗号化のため、libsodium または defuse/php-encryption を使用することを強くお勧めします。

暗号化手順:

  1. AES を採用する暗号化には CTR モードを使用します。
  2. 次を使用して暗号文を認証します。 HMAC-SHA-256 (または Poly1305)。

復号化手順:

  1. 暗号文の MAC を再計算し、元の MAC と比較します。 。不一致がある場合は中止します。
  2. 復号化を​​続行します。

設計上の考慮事項:

  1. 暗号文の圧縮を避けます。
  2. mb_strlen() を使用し、 「8 ビット」文字セット モードの mb_substr()。
  3. CSPRNG を利用して IV を生成します。 MCRYPT_RAND は避けてください。
  4. 認証前に必ず暗号化してください (AEAD を使用しない場合)。
  5. キャッシュ タイミングの脆弱性に注意してください。

使用しない場合暗号化:

  • パスワードストレージ (代わりに Argon2 などのパスワードハッシュアルゴリズムを使用)
  • URL パラメータ暗号化 (不適切なツール)

リブナトリウムPHP例:

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
        )
    );
    return $cipher;
}
ログイン後にコピー

Libsodium 復号化:

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
    );
    return $plain;
}
ログイン後にコピー

defuse/php-encryption 例:

use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;

$message = 'We are all living in a yellow submarine';
$key = Key::createNewRandomKey();
$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);
ログイン後にコピー

以上がLibsodium または defuse/php-encryption を使用して PHP 文字列を安全に暗号化および復号化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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