Rumah > pembangunan bahagian belakang > tutorial php > Bagaimana untuk Menyulitkan dan Menyahsulit Rentetan PHP dengan Selamat Menggunakan libsodium?

Bagaimana untuk Menyulitkan dan Menyahsulit Rentetan PHP dengan Selamat Menggunakan libsodium?

Patricia Arquette
Lepaskan: 2024-12-18 03:00:10
asal
921 orang telah melayarinya

How to Securely Encrypt and Decrypt PHP Strings Using libsodium?

Cara Menyulitkan dan Menyahsulit Rentetan PHP

Apabila membincangkan penyulitan, adalah penting untuk membezakan antara penyulitan dan pengesahan. Biasanya, penyulitan yang disahkan, yang menggabungkan penyulitan dengan kod pengesahan mesej (MAC), lebih diutamakan. Untuk memastikan keselamatan, sangat disyorkan untuk mengelak daripada melaksanakan kriptografi anda sendiri dan sebaliknya bergantung pada perpustakaan yang mantap yang dibangunkan dan disemak oleh pakar kriptografi.

Langkah Penyulitan Menggunakan libsodium:

  1. Sulitkan mesej menggunakan AES dalam mod CTR atau gunakan GCM, yang mengendalikan pengesahan secara tersirat.
  2. Sahkan teks sifir menggunakan HMAC-SHA-256, memastikan MAC meliputi kedua-dua IV dan teks sifir.

Langkah Penyahsulitan Menggunakan libsodium:

  1. Sahkan MAC teks sifir terhadap yang diterima MAC. Batalkan jika pengesahan gagal, menunjukkan kerosakan data.
  2. Nyahsulit mesej menggunakan kaedah penyulitan yang disahkan.

Pertimbangan Tambahan:

  • Elakkan memampatkan apa-apa sebelum ini penyulitan.
  • Gunakan fungsi manipulasi rentetan yang sesuai yang mengendalikan set aksara lanjutan.
  • Jana IV dengan selamat menggunakan penjana nombor pseudorandom (CSPRNG) yang selamat secara kriptografi.
  • Sentiasa lakukan penyulitan sebelum MAC untuk mengelakkan kelemahan.
  • Berhati-hati dengan potensi isu kebocoran maklumat dengan kaedah pengekodan tertentu.

Contoh Kod dengan 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;
}
?>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menyulitkan dan Menyahsulit Rentetan PHP dengan Selamat Menggunakan libsodium?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan