Anda mungkin sudah menggunakan setidaknya satu aspek kriptografi dalam proyek PHP Anda; Show
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 PHP1 fungsi dalam contoh di atas, Anda juga dapat menghitung string tanda tangan yang menyertakan pesan asli dan kemudian mendekodekannyaUntuk melakukannya, kita dapat menggunakan fungsi _2 dan 3 sebagai pengganti 4 dan 5. Namun, pesan itu sendiri tidak dienkripsi;Membungkusnya - pustaka enkripsi PHPSaya 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 0Bergantian, dimungkinkan untuk membuat daftar ekstensi PHP di PHP CLI, dan memeriksa hasilnya _Jika ekstensi Sodium tidak tersedia, aktifkan dengan menambahkan arahan 1. PHP 7. 2 dan yang lebih baru tidak memerlukan ekstensi file (mis. g. 2 atau 3 ) dalam arahan 1Contoh berikut akan bekerja dengan sebagian besar pengaturan PHP standar
Saat mengkompilasi PHP dari sumber, mengaktifkan ekstensi Sodium memerlukan flag 5 dan pustaka 6, mudah dipasang danDengan 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
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
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
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 9 APIKeempat 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 _1 berguna untuk menghasilkan nilai nonce acak
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
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
Cipher XChaCha20-Poly1305 memerlukan nonce , dan dibuat lebih mudah dengan konstanta bawaan
Dengan 7 dan 6 dihasilkan, saatnya untuk mengenkripsi pesan
Variabel _9 sekarang menyimpan pesan terenkripsi. Ini berisi tag otentikasi (MAC), dan Sodium menggunakannya secara otomatis untuk mengautentikasi pesanParameter kedua dari 5 menerima 1 yang berisi data tambahan. Nilai ini tidak dienkripsi atau disimpan bersama 9, tetapi digunakan sebagai tambahan untuk autentikasi. Dalam contoh ini, nilai ini sengaja dibiarkan hitam ( 3). Jika data autentikasi tambahan harus digunakan (seperti ID pengguna atau alamat IP), gunakan parameter iniSetelah 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 _7 (rahasia) yang disimpan dalam file yang hanya dapat diakses oleh proses yang mengenkripsi/mendekripsi pesan, dan 6 (nonce) dan 9 disimpan dalam databaseBergantung pada nilai parameter 8 di , nilai parameter tersebut mungkin perlu disimpan jugaSelain itu, fungsi _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 0 atau 1 sebelum mencetak atau mentransmisikan ke media yang tidak dapat menangani aliran byte mentah
Mendekripsi pesan memerlukan kunci rahasia asli ( 7) dan nilai Nonce ( 6)
Jika kunci, nonce, atau data tambahan yang diberikan tidak valid, fungsi ini mengembalikan 4
Ekstensi mcrypt dan OpenSSL juga menyediakan enkripsi simetris. Namun, mereka memiliki berbagai tingkat dukungan untuk autentikasi, panjang kunci, dan panjang nonce Secara umum, fungsi _5 adalah alternatif yang lebih baik untuk fungsi 6 dan 7Sodium 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
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
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
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
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 2 nya. Namun, artikel ini tidak membahas API tersebut pada saat ini untuk memastikan singkatnyaSetelah sukses tukar kunci
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 1 dan konstanta 4 bawaan, ditetapkan 5 0Sebelum 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 6Pengirim 1Dengan , , dan , sekarang saatnya untuk mengenkripsi pesan 2 7 fungsi mengenkripsi dan menandatangani pesan menggunakan pasangan kunci ( 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 ( 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 _6 harus disimpan/ditransmisikan bersama ciphertext, dan mungkin bersifat publikPastikan untuk membuat ulang nilai _6 untuk pesan berikutnya untuk mencegah serangan replayPenerima dapat mengautentikasi pesan dan memastikannya ditandatangani oleh pengirim jika penerima memiliki kunci publik pengirim (kunci publik Alice dalam contoh ini) 3 6 fungsi digunakan lagi untuk membuat pasangan kunci baru, tetapi kali ini dibuat dari kunci pribadi penerima, dan kunci publik pengirimSetelah pasangan kunci dibuat, dimungkinkan untuk mengotentikasi dan mendekripsi pesan 3 fungsi mengautentikasi bahwa pesan ditandatangani oleh pengirim (ditandatangani menggunakan kunci pribadi pengirim), dan mendekripsi pesan menggunakan kunci pribadi penerimaJika ada ketidakcocokan kunci atau nonce, 3 mengembalikan 4 4Jika penerima tidak perlu mengotentikasi pesan yang masuk, tetapi hanya mendekripsinya, itu mungkin kasus penggunaan API 9 SodiumFungsi 9 Sodium digunakan untuk mengenkripsi dan mendekripsi pesan menggunakan sepasang kunci publik dan pribadi. Perbedaan utama antara 9 tidak mengautentikasi pesanFungsi 9 Sodium mirip dengan 1 dan 2 OpenSSL, karena pasangan fungsi OpenSSL juga tidak menyediakan autentikasiDengan _9, hanya penerima yang perlu membuat pasangan kunci. Pengirim dapat memperoleh kunci publik penerima, dan mengenkripsi pesanPenerima 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 5Penerima harus menyimpan bagian kunci privat dari pasangan kunci dengan aman. Kunci publik ( _4) kemudian dapat didistribusikan melalui saluran yang amanCara 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
Dengan kunci publik penerima, setiap pengirim dapat mengenkripsi pesan 6Pesan 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(). |