Bagaimana Anda mengenkripsi data dekripsi menggunakan kunci rahasia pribadi di php?

Anda mungkin sudah menggunakan setidaknya satu aspek kriptografi dalam proyek PHP Anda;

Hashing adalah proses satu arah, mengubah data dengan panjang acak menjadi urutan byte dengan panjang tetap. Data yang sama dengan algoritma hashing yang sama akan selalu menghasilkan hash yang sama. Ini menjadikannya pilihan yang baik untuk kata sandi, karena tidak dapat dibalik - tidak mungkin mengambil hash dan langsung memulihkan data asli yang digunakan untuk membuatnya

Dengan demikian kita dapat menyimpan hash tanpa pernah menyimpan atau mengetahui kata sandi asli, tetapi mempertahankan kemampuan untuk memverifikasi apakah kata sandi yang dimasukkan pengguna benar

Namun, kadang-kadang, Anda perlu menyimpan data sensitif dengan aman sedemikian rupa sehingga Anda dapat mengambilnya nanti, aman karena mengetahui bahwa data tersebut belum diubah dan tidak ada penyerang atau orang yang tidak berwenang yang dapat melihatnya, bahkan jika mereka '

Untuk ini, kami memerlukan proses enkripsi dua arah yang dapat dibalik

Algoritma enkripsi secara luas dapat dibagi menjadi dua kategori utama. simetris (mis. e. menggunakan kata sandi atau kunci rahasia bersama) dan asimetris (mis. e. menggunakan pasangan kunci publik dan pribadi)

Kita juga dapat menggunakan teknik kriptografi untuk menandatangani data, yang merupakan cara untuk memastikan bahwa data tidak dirusak saat dikirimkan dari satu komputer ke komputer lain, atau antar sistem independen.

Versi modern PHP umumnya dikirimkan dengan dua opsi untuk mengelola kriptografi. OpenSSL dan Natrium

Sebelum PHP7. 2, ekstensi mcrypt biasa digunakan. Ekstensi ini tidak lagi didukung, jangan gunakan. Jika Anda belum mengupgrade ke PHP 7. 2 namun, pertimbangkan untuk menggunakan polyfill seperti Sodium Compat Paragonie. (Namun serius, tingkatkan sebagai hal yang mendesak - apa pun yang kurang dari PHP 7. 4 sudah EOL dan tidak didukung untuk pembaruan keamanan. )

Dalam posting ini, saya akan menjalankan tutorial tentang cara menggunakan ekstensi Sodium dengan cara yang benar untuk melakukan berbagai tugas kriptografi umum, termasuk enkripsi simetris dan asimetris serta otentikasi pesan.

Mengapa Natrium?

OpenSSL adalah pilihan yang baik jika Anda perlu bekerja dengan kunci RSA, seperti membuat sertifikat. Tetapi untuk mengenkripsi dan menandatangani data, OpenSSL mudah digunakan dengan cara yang salah. Kriptografi itu sulit dan memilih algoritme yang tepat, mengautentikasi data untuk memastikannya tidak diubah, mengelola kunci, dan lainnya adalah sesuatu yang perlu Anda lakukan sendiri dengan percaya diri saat menggunakan fungsi OpenSSL

Sebaliknya, Sodium adalah API tingkat tinggi yang dirancang untuk memudahkan penggunaan fungsi kriptografi dan mengurangi risiko pengguna membuat pilihan yang buruk. Ini menyediakan antarmuka sederhana untuk mengamankan dan membuktikan algoritma kriptografi, dan dirancang untuk digunakan dengan cara yang aman

Singkatnya, jika Anda bukan ahli kriptografi (dan saya tahu saya bukan), Anda cenderung membuat kesalahan saat menggunakan Sodium

Enkripsi kata sandi simetris dengan Sodium

"Simetris" berarti kunci (atau kata sandi) yang sama digunakan untuk mengenkripsi dan mendekripsi data

Dengan demikian, enkripsi simetris adalah pilihan yang baik jika Anda perlu mengenkripsi data yang disimpan dalam database, untuk pengambilan dan dekripsi nanti oleh sistem yang sama. Atau mengenkripsi data dalam jumlah besar seperti file, atau kasus lain di mana hanya satu pihak yang perlu mengetahui kunci rahasianya

Jika hanya Anda yang mengenkripsi data dan hanya Anda yang perlu mendekripsi data, Anda dapat menggunakan enkripsi simetris

Menggunakan Sodium untuk mengenkripsi data dengan PHP

1 fungsi dalam contoh di atas, Anda juga dapat menghitung string tanda tangan yang menyertakan pesan asli dan kemudian mendekodekannya

Untuk melakukannya, kita dapat menggunakan fungsi

_2 dan 
3 sebagai pengganti 
4 dan 
5. Namun, pesan itu sendiri tidak dienkripsi; 

Membungkusnya - pustaka enkripsi PHP

Saya telah membuat kelas pembungkus yang ringan dan mudah digunakan untuk setiap teknik kriptografi PHP yang telah Anda lihat tercakup dalam posting ini

mcrypt adalah salah satu ekstensi PHP tertua yang menghadirkan kemampuan enkripsi/dekripsi ke PHP. Itu tidak lagi dipertahankan, dan PHP membatalkan bundelnya dalam PHP 7. 2

OpenSSL adalah perpustakaan lain yang diadopsi lebih luas, dan didukung secara aktif. OpenSSL menawarkan berbagai cipher, pertukaran kunci, dan algoritma autentikasi, dan beberapa di antaranya dapat menjadi tidak aman jika digunakan pada kasus penggunaan yang salah. Misalnya, algoritme enkripsi paling umum yang ditawarkan OpenSSL adalah AES (Advanced Encryption Standard ) memiliki beberapa mode operasi dan ukuran kunci yang menyisakan ruang untuk penggunaan yang tidak aman. Sejak awal, mode AES seperti ECB (Electronic codebook), dan beberapa mode seperti CBC (Cipher block chaining) memerlukan autentikasi pesan terenkripsi agar benar-benar aman, dan masih rentan terhadap serangan padding oracle, seperti PODLE

Libsodium, garpu NaCl adalah perpustakaan kriptografi yang lebih modern dan banyak pendapat. Ini menawarkan default yang aman dan masuk akal, dan menghilangkan banyak pengambilan keputusan dari pengguna akhir hingga pengelola perpustakaan. PHP. Libsodium tersedia sebagai ekstensi PECL, tetapi PHP juga menyertakan ekstensi dalam inti PHP sejak PHP 7. 2



Sejak PHP 7. 2, ekstensi Sodium termasuk dalam inti PHP. Kemungkinan ekstensi Sodium sudah tersedia dan diaktifkan, yang dapat dikonfirmasi dari

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
0

Bagaimana Anda mengenkripsi data dekripsi menggunakan kunci rahasia pribadi di php?

Bergantian, dimungkinkan untuk membuat daftar ekstensi PHP di PHP CLI, dan memeriksa hasilnya

php -m | grep sodium
_

Bagaimana Anda mengenkripsi data dekripsi menggunakan kunci rahasia pribadi di php?


Jika ekstensi Sodium tidak tersedia, aktifkan dengan menambahkan arahan

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
1. PHP 7. 2 dan yang lebih baru tidak memerlukan ekstensi file (mis. g.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
2 atau
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
3 ) dalam arahan
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
1

Contoh berikut akan bekerja dengan sebagian besar pengaturan PHP standar

extension=sodium

Saat mengkompilasi PHP dari sumber, mengaktifkan ekstensi Sodium memerlukan flag

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
5 dan pustaka
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
6, mudah dipasang dan

Dengan enkripsi dan dekripsi simetris, kunci yang sama digunakan untuk mengenkripsi dan mendekripsi. Dalam kehidupan nyata, ini mirip dengan menggunakan kunci pintu yang mengunci dan membuka kunci pintu menggunakan kunci


Jika pesan dienkripsi dan didekripsi pada perangkat yang sama, enkripsi simetris lebih tepat. Beberapa contoh kasus penggunaan enkripsi simetris

  • Mengenkripsi cookie browser sebelum mengirimkannya ke pengguna, dan mendekripsi cookie yang masuk
  • Mengenkripsi drive penyimpanan dan mendekripsinya dengan kunci yang sama
  • Enkripsi file Zip/Rar

Enkripsi asimetris melibatkan sepasang kunci. Kunci publik dan kunci privatnya

Asimetri di sini adalah bahwa pesan dienkripsi dengan kunci publik, dan hanya dapat didekripsi dengan kunci privat. Seperti namanya, publik dapat didistribusikan secara bebas dan publik. Ketika pasangan kunci dibuat, pasangan kunci dibuat dengan cara yang memungkinkan secara matematis untuk kunci pribadi — dan kunci pribadi saja — untuk mendekripsi pesan yang dienkripsi dengan kunci publik

Asimetri ini memungkinkan untuk berbagi kunci publik dengan pihak yang berkepentingan, dan meminta mereka mengirim pesan terenkripsi yang tidak dapat dibaca orang lain tanpa kunci privat


Beberapa kasus penggunaan untuk kasus penggunaan asimetris termasuk

  • Mengenkripsi log server, dan mengirimkannya ke server jarak jauh, sehingga hanya server jarak jauh yang dapat membacanya
  • Jabat tangan SSL/TLS
  • Mengirim dienkripsi dengan kunci publik penerima

Ekstensi PHP Sodium menyediakan beberapa algoritme dengan default optimal dan ukuran kunci berpendirian untuk mengenkripsi/mendekripsi data menggunakan kunci

Semua algoritme yang disediakan oleh ekstensi Sodium menyediakan enkripsi yang diautentikasi, yang berarti teks terenkripsi akan diautentikasi terhadap gangguan. Ini mencegah serangan Ciphertext Terpilih. Dengan pendekatan seperti mcrypt atau sebagian besar sandi dari OpenSSL, terserah penelepon untuk membuat HMAC/tanda tangan dan melindungi dari serangan semacam itu

Aplikasi yang perlu menyimpan tag autentikasi (MAC) dan teks terenkripsi dapat melakukannya dengan menggunakan varian API "terpisah" yang disediakan Sodium

Saat ini, Sodium menyediakan empat cipher untuk dipilih

CipherKey sizeNonce sizeMAC sizeNotesAES256-GCM256 bits96 bits128 bitsDidukung secara luas di banyak perpustakaan, Memerlukan dukungan perangkat kerasChaCha20-Poly1305256 bits64 bits128 bitDidukung secara luas di banyak perpustakaan dan Libsodium >= 0. 6. 0ChaCha20-Poly1305 - IETF256 bits96 bits128 bitDidukung secara luas di banyak perpustakaan dan Libsodium >= 1. 0. 4XChaCha20-Poly1305 - IETF256 bits192 bits128 bitDidukung secara luas di banyak perpustakaan dan Libsodium >= 1. 0. 12XSalsa20-Poly1305256 bits192 bits128 bitPilihan default untuk
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
9 API

Keempat cipher menyediakan otentikasi secara default, aman untuk digunakan. Memilih cipher yang sesuai adalah keseimbangan antara kompatibilitas dengan perpustakaan lain dan bahasa pemrograman serta perkakas

AES256-GCM didukung secara luas di sebagian besar CPU (set instruksi AES-NI), dan didukung di ekstensi lain seperti OpenSSL

Jika kompatibilitas antara bahasa pemrograman lain dan perkakas tidak menjadi perhatian, ini adalah pilihan teraman, dan merupakan fokus dari sisa bagian ini

Ekstensi sodium menyediakan fungsi untuk membuat kunci, mengenkripsi, dan mendekripsi pesan dengan mudah. Selain itu, fungsi

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
_1 berguna untuk menghasilkan nilai nonce acak

  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    2. Menghasilkan kunci rahasia dengan panjang yang dibutuhkan
  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    1. Menghasilkan byte acak
  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    _4. Mengenkripsi pesan
  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    5. Mendekripsi pesan

Kunci rahasia untuk enkripsi simetris dihasilkan menggunakan generator nomor pseudorandom yang aman secara kriptografis

Sodium menyediakan fungsi yang mudah untuk menghasilkan kunci dengan panjang yang dibutuhkan

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

Kunci ini harus disimpan dengan aman, dan juga akan digunakan untuk mendekripsi pesan

Untuk mencegah serangan replay, setiap pesan terenkripsi harus berbeda meskipun sumber datanya sama. Ini dicapai dengan menghasilkan nilai acak yang disebut nonce. Nilai ini digunakan sekali, dan dihasilkan untuk setiap pesan terenkripsi

Nonce tidak harus acak, tetapi harus unik. Menggunakan nilai acak dengan panjang yang memadai membuatnya tidak perlu memeriksa nilai nonce yang ada untuk memastikan

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 yang dihasilkan unik

Cipher XChaCha20-Poly1305 memerlukan nonce , dan dibuat lebih mudah dengan konstanta bawaan

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

Dengan

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
7 dan
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 dihasilkan, saatnya untuk mengenkripsi pesan

$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);

Variabel

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
_9 sekarang menyimpan pesan terenkripsi. Ini berisi tag otentikasi (MAC), dan Sodium menggunakannya secara otomatis untuk mengautentikasi pesan

Parameter kedua dari

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
5 menerima
$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);
1 yang berisi data tambahan. Nilai ini tidak dienkripsi atau disimpan bersama
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
9, tetapi digunakan sebagai tambahan untuk autentikasi. Dalam contoh ini, nilai ini sengaja dibiarkan hitam (
$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);
3). Jika data autentikasi tambahan harus digunakan (seperti ID pengguna atau alamat IP), gunakan parameter ini

Setelah teks terenkripsi dihasilkan, itu berisi tag otentikasi, yang akan mencegah perusakan teks terenkripsi yang tidak terduga dan berbahaya

Diperlukan untuk mendekripsi pesan, dan harus disimpan bersama dengan pesan terenkripsi. Contohnya adalah kunci

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
_7 (rahasia) yang disimpan dalam file yang hanya dapat diakses oleh proses yang mengenkripsi/mendekripsi pesan, dan
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 (nonce) dan
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
9 disimpan dalam database

Bergantung pada nilai parameter

$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);
8 di , nilai parameter tersebut mungkin perlu disimpan juga

Selain itu, fungsi

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
_4 mengembalikan aliran byte. Itu tidak dapat langsung dicetak (pada halaman web atau respons JSON misalnya), dan harus dikonversi ke format teks menggunakan fungsi seperti
echo bin2hex($encrypted_text);
0 atau
echo bin2hex($encrypted_text);
1 sebelum mencetak atau mentransmisikan ke media yang tidak dapat menangani aliran byte mentah

echo bin2hex($encrypted_text);

Mendekripsi pesan memerlukan kunci rahasia asli (

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
7) dan nilai Nonce (
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6)

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);

Jika kunci, nonce, atau data tambahan yang diberikan tidak valid, fungsi ini mengembalikan

echo bin2hex($encrypted_text);
4


// Generate a secret key. This value must be stored securely.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

// Generate a nonce for EACH MESSAGE. This can be public, and must be provided to decrypt the message.
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

// Text to encrypt.
$message = 'Hello World';

// Encrypt
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, '', $nonce, $key);

// Decrypt
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);

Ekstensi mcrypt dan OpenSSL juga menyediakan enkripsi simetris. Namun, mereka memiliki berbagai tingkat dukungan untuk autentikasi, panjang kunci, dan panjang nonce

Secara umum, fungsi

echo bin2hex($encrypted_text);
_5 adalah alternatif yang lebih baik untuk fungsi
echo bin2hex($encrypted_text);
6 dan
echo bin2hex($encrypted_text);
7


Sodium juga menyediakan cara untuk mengenkripsi dan mendekripsi pesan secara asimetris

Enkripsi asimetris melibatkan dua pihak. Kedua belah pihak membuat pasangan kunci, yang berisi kunci privat dan kunci publik. Kunci publik didistribusikan ke pihak lain yang perlu berkomunikasi

Misalnya, jika Alice dan Bob ingin berkomunikasi dengan aman, dan harus memastikannya

  1. Pesan memang dari Alice/Bob, dan bukan dari orang lain
  2. Pesan bersifat pribadi, tidak ada yang dapat membaca atau merusaknya

Ekstensi Sodium menyediakan API Crypto Box yang memenuhi keaslian dan privasi pesan tersebut. Sebelum mengirim pesan, Alice dan Bob (atau semua pihak yang terlibat) harus membuat pasangan kunci, dan menukar kunci publik dengan aman

Sodium juga menyediakan protokol pertukaran kunci yang aman, tetapi tidak tercakup dalam artikel ini

Saat pesan dikirim, pengirim mengenkripsinya dengan kunci publik penerima, dan menandatanganinya dengan kunci pribadi pengirim. Setelah pesan dikirimkan, penerima mengautentikasi pesan dengan kunci publik pengirim, dan mendekripsi dengan kunci pribadi penerima

Jika penerima tidak perlu mengautentikasi pesan yang diterima — pastikan bahwa pesan tersebut memang dikirim oleh pengirim — ekstensi Sodium juga menggunakan

extension=sodium
9 API

Semua pihak yang perlu berkomunikasi harus membuat pasangan kunci. Rahasianya harus dirahasiakan, karena digunakan untuk menandatangani dan mendekripsi pesan

Secara individual di perangkat Alice dan Bob

$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
$bob_keypair = sodium_crypto_box_keypair();
$bob_secret_key = sodium_crypto_box_secretkey($bob_keypair);
$bob_public_key = sodium_crypto_box_publickey($bob_keypair);
  • echo bin2hex($encrypted_text);
    9 menghasilkan pasangan kunci acak yang berisi kunci rahasia X25519 dan kunci publik X25519 yang sesuai
  • $original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
    0 mengekstrak bagian kunci rahasia dari pasangan kunci
  • $original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
    1 mengekstrak kunci publik dari pasangan kunci

Untuk enkripsi dan dekripsi asimetris yang diautentikasi, kedua pihak yang terlibat harus menukar kunci publik mereka dengan aman. Ini dapat dilakukan dengan menggunakan protokol pertukaran kunci, atau mentransmisikan kunci menggunakan saluran aman lainnya, seperti permintaan HTTPS

Sodium menyediakan fungsionalitas pertukaran kunci dengan fungsi

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
2 nya. Namun, artikel ini tidak membahas API tersebut pada saat ini untuk memastikan singkatnya

Setelah sukses tukar kunci

  • Alice harus memiliki kunci publik Alice, kunci privat Alice, dan kunci publik Bob
  • Bob harus memiliki kunci publik Bob, kunci privat Bob, dan kunci publik Alice

Mirip dengan enkripsi simetris, pesan asimetris yang diautentikasi juga harus menggunakan nilai nonce

Nilai nonce harus 192 bit (24 byte), yang dapat dengan mudah dibuat menggunakan fungsi

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
1 dan konstanta
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
4 bawaan, ditetapkan
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
5

extension=sodium
0

Sebelum mengenkripsi pesan, pengirim (Alice dalam contoh ini) harus membuat pasangan kunci baru, yang berisi kunci publik penerima dan kunci pribadi pengirim. Ini dapat dilakukan dengan menggabungkan kunci publik dan kunci privat, atau menggunakan fungsi

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
6

Pengirim

extension=sodium
1

Dengan , , dan , sekarang saatnya untuk mengenkripsi pesan

extension=sodium
2

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
7 fungsi mengenkripsi dan menandatangani pesan menggunakan pasangan kunci (
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
8). Kunci pribadi pengirim digunakan untuk membuat tanda tangan, dan kunci publik penerima digunakan untuk mengenkripsi pesan yang sebenarnya. Tag otentikasi disimpan di samping teks terenkripsi (
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
9)

Setelah pesan dienkripsi dan ditandatangani, hanya penerima yang dapat mendekripsi pesan dengan kunci privat. Siapa pun yang memiliki kunci publik pengirim dapat mengautentikasi pesan, tetapi tidak dapat membaca isinya tanpa kunci privat penerima

Nilai nonce

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
_6 harus disimpan/ditransmisikan bersama ciphertext, dan mungkin bersifat publik

Pastikan untuk membuat ulang nilai

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
_6 untuk pesan berikutnya untuk mencegah serangan replay

Penerima dapat mengautentikasi pesan dan memastikannya ditandatangani oleh pengirim jika penerima memiliki kunci publik pengirim (kunci publik Alice dalam contoh ini)

extension=sodium
3

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
6 fungsi digunakan lagi untuk membuat pasangan kunci baru, tetapi kali ini dibuat dari kunci pribadi penerima, dan kunci publik pengirim

Setelah pasangan kunci dibuat, dimungkinkan untuk mengotentikasi dan mendekripsi pesan


// Generate a secret key. This value must be stored securely.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

// Generate a nonce for EACH MESSAGE. This can be public, and must be provided to decrypt the message.
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

// Text to encrypt.
$message = 'Hello World';

// Encrypt
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, '', $nonce, $key);

// Decrypt
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
3 fungsi mengautentikasi bahwa pesan ditandatangani oleh pengirim (ditandatangani menggunakan kunci pribadi pengirim), dan mendekripsi pesan menggunakan kunci pribadi penerima

Jika ada ketidakcocokan kunci atau nonce,


// Generate a secret key. This value must be stored securely.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

// Generate a nonce for EACH MESSAGE. This can be public, and must be provided to decrypt the message.
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

// Text to encrypt.
$message = 'Hello World';

// Encrypt
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, '', $nonce, $key);

// Decrypt
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
3 mengembalikan
echo bin2hex($encrypted_text);
4

extension=sodium
4

Jika penerima tidak perlu mengotentikasi pesan yang masuk, tetapi hanya mendekripsinya, itu mungkin kasus penggunaan API

extension=sodium
9 Sodium

Fungsi

extension=sodium
9 Sodium digunakan untuk mengenkripsi dan mendekripsi pesan menggunakan sepasang kunci publik dan pribadi. Perbedaan utama antara
extension=sodium
9 tidak mengautentikasi pesan

Fungsi

extension=sodium
9 Sodium mirip dengan
$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
1 dan
$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
2 OpenSSL, karena pasangan fungsi OpenSSL juga tidak menyediakan autentikasi

Dengan

extension=sodium
_9, hanya penerima yang perlu membuat pasangan kunci. Pengirim dapat memperoleh kunci publik penerima, dan mengenkripsi pesan

Penerima dapat mendekripsi pesan apa pun yang dienkripsi dengan kunci publiknya, tetapi tidak memiliki cara untuk mengidentifikasi atau mengautentikasi identitas pengirim

Dengan enkripsi asimetris yang tidak diautentikasi, hanya penerima yang diminta untuk membuat pasangan kunci

extension=sodium
5

Penerima harus menyimpan bagian kunci privat dari pasangan kunci dengan aman. Kunci publik (

$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
_4) kemudian dapat didistribusikan melalui saluran yang aman

Cara termudah dan paling umum untuk mendistribusikan kunci publik adalah melalui koneksi HTTPS. Misalnya, pengirim dapat mengunduh kunci publik pengirim dari situs web penerima yang disajikan melalui HTTPS

Perhatikan bahwa meskipun enkripsi asimetris anonim tidak menyediakan autentikasi untuk pesan, kunci publik harus dikirim dengan aman, dan pengirim harus memvalidasi kunci publik penerima sesuai dengan penerima yang sebenarnya, dan kunci tidak dirusak selama transmisi

Dengan kunci publik penerima, setiap pengirim dapat mengenkripsi pesan

extension=sodium
6

Pesan terenkripsi hanya dapat dibuka oleh penerima yang memegang kunci privat. Namun, karena tidak ada otentikasi atau nilai nonce yang terlibat, ini rentan terhadap serangan ulangan

Untuk mendekripsi pesan yang dienkripsi dengan kunci publik, penerima harus memiliki kunci pribadi yang sesuai

Bagaimana cara mendekripsi data terenkripsi dalam PHP?

Dalam bahasa pemrograman PHP, Enkripsi, serta Dekripsi data string, dilakukan menggunakan fungsi OpenSSL . Di sini, kita dapat mengenkripsi dan mendekripsi nilai masing-masing melalui openssl_encrypt(data) dan openssl_decrypt(data). Kita bisa menggunakan metode tunggal atau kedua metode bahasa PHP.

Bisakah Anda mengenkripsi dan mendekripsi dengan kunci pribadi?

Kunci pribadi digunakan untuk mendekripsi, juga untuk mengenkripsi , jadi menggunakannya untuk enkripsi simetris memerlukan pertukaran kunci untuk membagikan kunci itu secara aman dengan pihak tepercaya yang berwenang untuk bertukar aman . Perangkat lunak kriptografi biasanya digunakan untuk mengotomatiskan proses ini.

Bagaimana cara mengenkripsi dan mendekripsi menggunakan PHP kunci publik dan pribadi?

openssl_public_encrypt() mengenkripsi data dengan kunci_publik publik dan menyimpan hasilnya ke dalam data_enkripsi. Data terenkripsi dapat didekripsi melalui openssl_private_decrypt() . Fungsi ini dapat digunakan e. g. untuk mengenkripsi pesan yang kemudian hanya dapat dibaca oleh pemilik kunci privat.

Bagaimana cara mengenkripsi kata sandi dekripsi di PHP?

Dekripsi kata sandi. Untuk mendekripsi hash kata sandi dan mengambil string asli, kami menggunakan fungsi password_verify() . Fungsi password_verify() memverifikasi bahwa hash yang diberikan cocok dengan kata sandi yang diberikan, dihasilkan oleh fungsi password_hash().