Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah saya boleh menyulitkan dan menyahsulit rentetan dalam PHP dengan selamat?

Bagaimanakah saya boleh menyulitkan dan menyahsulit rentetan dalam PHP dengan selamat?

Patricia Arquette
Patricia Arquetteasal
2024-12-26 20:33:16450semak imbas

How Can I Encrypt and Decrypt Strings in PHP Securely?

Bagaimanakah anda Menyulitkan dan Menyahsulit Rentetan PHP?

Menyulitkan rentetan PHP melibatkan penukaran rentetan asal kepada format yang disulitkan menggunakan kekunci atau garam. Menyahsulit rentetan memerlukan kekunci atau garam yang sama untuk mendapatkan semula rentetan asal.

Proses Penyulitan

  1. Sulit: Sulitkan rentetan asal menggunakan algoritma selamat seperti AES-256 dalam CTR (Mod Kaunter) atau GCM (Galois/Counter Mod).
  2. Sahkan: Kira MAC (Kod Pengesahan Mesej) untuk rentetan yang disulitkan menggunakan HMAC-SHA-256. Gabungkan rentetan yang disulitkan dan MAC untuk menjana hasil yang disulitkan akhir.

Proses Penyahsulitan

  1. Sahkan: Kira semula MAC untuk hasil yang disulitkan dan bandingkan dengan MAC yang disertakan. Batalkan jika ia berbeza.
  2. Nyahsulit: Nyahsulit rentetan yang disulitkan menggunakan kekunci yang betul.

Pertimbangan Utama

  • Gunakan algoritma penyulitan yang disahkan (cth., AES-GCM, ChaCha20-Poly1305) untuk kedua-dua penyulitan dan pengesahan.
  • Gunakan perpustakaan selamat seperti libsodium atau defuse/php-encryption untuk fungsi penyulitan dan penyahsulitan yang teguh.
  • Elakkan melancarkan kriptografi anda sendiri kerana potensi risiko keselamatan .
  • Jana IV (penginisiatifan vektor) menggunakan CSPRNG (Cryptography Secure Pseudo-Random Number Generator) seperti random_bait atau sodium_randombytes.
  • Lindungi kunci penyulitan dengan berhati-hati. Pertimbangkan untuk menggunakan kunci penyulitan kunci atau sistem pengurusan kunci yang selamat.

Contoh menggunakan 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);

Atas ialah kandungan terperinci Bagaimanakah saya boleh menyulitkan dan menyahsulit rentetan dalam PHP dengan selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn