Yang saya maksud:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
Mungkin sesuatu seperti:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
- Di PHP, bagaimana Anda bisa melakukan ini?
Mencoba menggunakan Crypt_Blowfish
, tetapi tidak berhasil untuk saya.
Jawaban:
Sebelum Anda melakukan sesuatu lebih jauh, cobalah untuk memahami perbedaan antara enkripsi dan otentikasi , dan mengapa Anda mungkin menginginkan enkripsi yang diautentikasi daripada hanya enkripsi .
Untuk menerapkan enkripsi yang diautentikasi, Anda ingin Mengenkripsi kemudian MAC. Urutan enkripsi dan otentikasi sangat penting!Salah satu jawaban yang ada untuk pertanyaan ini membuat kesalahan ini; seperti halnya banyak pustaka kriptografi yang ditulis dalam PHP.
Anda harus menghindari penerapan kriptografi Anda sendiri , dan sebagai gantinya menggunakan perpustakaan aman yang ditulis oleh dan ditinjau oleh para ahli kriptografi.
Gunakan libsodium jika Anda memiliki akses PECL (atau sodium_compat jika Anda ingin libsodium tanpa PECL); jika tidak ...
Gunakan defuse / php-enkripsi ; jangan roll kriptografi Anda sendiri!
Kedua perpustakaan yang ditautkan di atas membuatnya mudah dan tidak menyakitkan untuk menerapkan enkripsi terotentikasi ke perpustakaan Anda sendiri.
Jika Anda masih ingin menulis dan menggunakan pustaka kriptografi Anda sendiri, bertentangan dengan kebijaksanaan konvensional setiap ahli kriptografi di Internet, ini adalah langkah-langkah yang harus Anda ambil.
Enkripsi:
Dekripsi:
hash_equals()
. Jika gagal, batalkan.Pertimbangan Desain Lainnya:
mb_strlen()
danmb_substr()
, menggunakan'8bit'
mode set karakter untuk mencegahmbstring.func_overload
masalah.mcrypt_create_iv()
, JANGAN GUNAKANMCRYPT_RAND
!bin2hex()
,,base64_encode()
dll. dapat membocorkan informasi tentang kunci enkripsi Anda melalui waktu cache. Hindari mereka jika memungkinkan.Bahkan jika Anda mengikuti saran yang diberikan di sini, banyak yang bisa salah dengan kriptografi. Selalu minta pakar kriptografi meninjau penerapan Anda. Jika Anda tidak cukup beruntung untuk menjadi teman pribadi dengan seorang siswa kriptografi di universitas lokal Anda, Anda selalu dapat mencoba Cryptography Stack Exchange untuk meminta saran.
Jika Anda memerlukan analisis profesional tentang implementasi Anda, Anda selalu dapat menyewa tim konsultan keamanan yang memiliki reputasi baik untuk meninjau kode kriptografi PHP Anda (pengungkapan: perusahaan saya).
Penting: Kapan Tidak Menggunakan Enkripsi
Jangan mengenkripsi kata sandi . Anda ingin menggunakan hash sebagai gantinya, menggunakan salah satu dari algoritma hashing kata sandi ini:
Jangan pernah menggunakan fungsi hash tujuan umum (MD5, SHA256) untuk penyimpanan kata sandi.
Jangan mengenkripsi Parameter URL . Ini alat yang salah untuk pekerjaan itu.
Contoh Enkripsi String PHP dengan Libsodium
Jika Anda menggunakan PHP <7.2 atau tidak menginstal libsodium, Anda dapat menggunakan sodium_compat untuk mencapai hasil yang sama (walaupun lebih lambat).
Kemudian untuk mengujinya:
Halite - Libsodium Membuat Lebih Mudah
Salah satu proyek yang saya kerjakan adalah perpustakaan enkripsi bernama Halite , yang bertujuan untuk membuat libsodium lebih mudah dan lebih intuitif.
Semua kriptografi yang mendasarinya ditangani oleh libsodium.
Contoh dengan defuse / php-enkripsi
Catatan :
Crypto::encrypt()
mengembalikan output hex-encoded.Manajemen Kunci Enkripsi
Jika Anda tergoda untuk menggunakan "kata sandi", berhentilah sekarang. Anda memerlukan kunci enkripsi 128-bit acak, bukan kata sandi yang mudah diingat manusia.
Anda dapat menyimpan kunci enkripsi untuk penggunaan jangka panjang seperti:
Dan, sesuai permintaan, Anda dapat mengambilnya seperti ini:
Saya sangat menyarankan hanya menyimpan kunci yang dibuat secara acak untuk penggunaan jangka panjang dan bukan jenis kata sandi sebagai kunci (atau untuk menurunkan kunci).
Jika Anda menggunakan perpustakaan Defuse:
$string = $keyObject->saveToAsciiSafeString()
$loaded = Key::loadFromAsciiSafeString($string);
"Tapi aku benar - benar ingin menggunakan kata sandi."
Itu ide yang buruk, tapi oke, inilah cara melakukannya dengan aman.
Pertama, buat kunci acak dan simpan dalam konstanta.
Perhatikan bahwa Anda menambahkan pekerjaan ekstra dan bisa menggunakan konstanta ini sebagai kuncinya dan menyelamatkan diri Anda dari sakit hati!
Kemudian gunakan PBKDF2 (seperti itu) untuk mendapatkan kunci enkripsi yang sesuai dari kata sandi Anda daripada langsung mengenkripsi dengan kata sandi Anda.
Jangan hanya menggunakan kata sandi 16 karakter. Kunci enkripsi Anda akan rusak secara komikal.
sumber
password_hash()
dan periksa denganpassword_verify()
.function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
Saya terlambat ke pesta, tetapi mencari cara yang benar untuk melakukannya saya menemukan halaman ini adalah salah satu pengembalian pencarian Google teratas, jadi saya ingin berbagi pandangan saya tentang masalah ini, yang saya anggap sebagai up to date pada saat penulisan posting ini (awal 2017). Dari PHP 7.1.0
mcrypt_decrypt
danmcrypt_encrypt
akan ditinggalkan, jadi membangun kode bukti masa depan harus menggunakan openssl_encrypt dan openssl_decryptAnda dapat melakukan sesuatu seperti:
Anda dapat menggunakan metode chipper lainnya juga, tergantung pada kebutuhan keamanan Anda. Untuk mengetahui metode chipper yang tersedia, silakan lihat fungsi openssl_get_cipher_methods .
sumber
prod_id=123
tetapi saya hanya tidak ingin membuat 123 dapat dibaca untuk semua orang, namun meskipun mereka bisa membacanya, itu tidak akan menjadi masalah. Penyerang yang bisa mengganti 123 ke nilai kustom tidak akan menyebabkan kerugian, ia hanya akan bisa mendapatkan detail dari produk lain, tetapi Joe Average User tidak akan memiliki petunjuk tentang cara mendapatkan detail untuk produk 124 misalnya. Untuk skenario seperti ini, ini adalah solusi sempurna, untuk keamanan itu tidak jalan!Apa yang tidak dilakukan
Saya mengerti sendiri. Sebenarnya saya menemukan beberapa jawaban di google dan baru saja memodifikasi sesuatu. Namun hasilnya benar-benar tidak aman.
sumber
base64_encode(encrypt($string))
- Untuk mendekripsi:decrypt(base64_decode($encrypted))
mcrypt_encrypt
mengganti kode sampel : php.net/manual/en/function.mcrypt-encrypt.php . Perhatikan bahwa meninjaunya sekarang mungkin harus memilikirtrim
karakter"\0"
for pada akhirnya.Untuk kerangka Laravel
Jika Anda menggunakan kerangka Laravel maka lebih mudah untuk mengenkripsi dan mendekripsi dengan fungsi internal.
sumber
Diperbarui
Versi siap PHP 7. Ini menggunakan fungsi openssl_encrypt dari Perpustakaan PHP OpenSSL .
sumber
Saya telah meninggalkan jawaban ini untuk tujuan historis - tetapi beberapa metode sekarang sudah usang, metode enkripsi DES bukan praktik yang disarankan, dll.
Saya belum memperbarui kode ini karena dua alasan: 1) Saya tidak lagi bekerja dengan metode enkripsi dengan tangan di PHP, dan 2) kode ini masih melayani tujuan yang dimaksudkan: untuk menunjukkan konsep minimum dan sederhana tentang bagaimana enkripsi dapat bekerja dalam PHP.
Jika Anda menemukan sumber yang serupa, "Enkripsi PHP untuk boneka" yang dapat membuat orang mulai dengan 10-20 baris kode atau kurang, beri tahu saya dalam komentar.
Di luar itu, silakan nikmati Episode Klasik ini dari jawaban enkripsi minimalis PHP4 era awal.
Idealnya Anda memiliki - atau bisa mendapatkan - akses ke pustaka mcrypt PHP, karena berbagai tugas yang sangat populer dan sangat berguna. Berikut ini adalah beberapa jenis enkripsi dan beberapa kode contoh: Teknik Enkripsi dalam PHP
Beberapa peringatan:
1) Jangan pernah menggunakan enkripsi reversibel, atau "simetris" ketika hash satu arah akan dilakukan.
2) Jika data benar-benar sensitif, seperti kartu kredit atau nomor jaminan sosial, hentikan; Anda membutuhkan lebih dari yang bisa diberikan oleh sepotong kode sederhana, tetapi Anda membutuhkan pustaka crypto yang dirancang untuk tujuan ini dan banyak waktu untuk meneliti metode yang diperlukan. Selanjutnya, perangkat lunak kripto mungkin <10% dari keamanan data sensitif. Ini seperti membuat ulang stasiun tenaga nuklir - menerima bahwa tugas itu berbahaya dan sulit dan di luar pengetahuan Anda jika itu yang terjadi. Hukuman finansial bisa sangat besar, jadi lebih baik menggunakan layanan dan mengirimkan tanggung jawab kepada mereka.
3) Segala jenis enkripsi yang mudah diterapkan, seperti yang tercantum di sini, dapat secara wajar melindungi informasi yang agak penting yang ingin Anda jaga agar tidak terbelalak atau membatasi paparan jika terjadi kebocoran yang tidak disengaja / disengaja. Tetapi melihat bagaimana kunci disimpan dalam teks biasa di server web, jika mereka bisa mendapatkan data mereka bisa mendapatkan kunci dekripsi.
Bagaimanapun, bersenang-senang :)
sumber
M�������f=�_=
karakter aneh sebagai yang terenkripsi. Tidak bisakah saya mendapatkan karakter sederhana? Seperti:2a2ffa8f13220befbe30819047e23b2c
. Juga, tidak bisakah saya mengubah PANJANG$key_value
(tetap ke 8 ???) dan PANJANG output$encrypted_text
? (tidak bisakah panjangnya 32 atau 64 atau lebih lama ??)MCRYPT_RIJNDAEL_128
), dan ciphertext harus diotentikasi (hash_hmac()
, diverifikasi denganhash_equals()
).Jika Anda tidak ingin menggunakan perpustakaan (yang harus Anda) maka gunakan sesuatu seperti ini (PHP 7):
sumber
define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);
Ini adalah metode ringkas untuk mengenkripsi / mendekripsi string dengan PHP menggunakan AES256 CBC :
Pemakaian:
sumber
Kode di bawah ini berfungsi di php untuk semua string dengan karakter khusus
sumber