Apa cara paling sederhana untuk melakukan enkripsi dua arah dalam pemasangan PHP yang umum?
Saya harus dapat mengenkripsi data dengan kunci string, dan menggunakan kunci yang sama untuk mendekripsi di ujung lainnya.
Keamanannya tidak sebesar perhatian dari portabilitas kode, jadi saya ingin dapat menjaga hal-hal sesederhana mungkin. Saat ini, saya menggunakan implementasi RC4, tetapi jika saya dapat menemukan sesuatu yang didukung secara native, saya pikir saya dapat menyimpan banyak kode yang tidak perlu.
php
security
encryption
cryptography
encryption-symmetric
pengguna1206970
sumber
sumber
Sodium::crypto_secretbox()
danSodium::crypto_secretbox_open()
aman dan berkinerja.Jawaban:
Diedit:
Anda harus benar-benar menggunakan openssl_encrypt () & openssl_decrypt ()
Seperti yang dikatakan Scott , Mcrypt bukan ide yang baik karena belum diperbarui sejak 2007.
Bahkan ada RFC untuk menghapus Mcrypt dari PHP - https://wiki.php.net/rfc/mcrypt-viking-funeral
sumber
Penting : Kecuali Anda memiliki case-use yang sangat khusus, jangan mengenkripsi kata sandi , gunakan algoritma hashing kata sandi. Ketika seseorang mengatakan mereka mengenkripsi kata sandi mereka di aplikasi sisi server, mereka entah tidak memberi tahu atau mereka menggambarkan desain sistem yang berbahaya. Menyimpan kata sandi dengan aman adalah masalah yang sama sekali terpisah dari enkripsi.
Telah diinformasikan. Desain sistem yang aman.
Enkripsi Data Portabel dalam PHP
Jika Anda menggunakan PHP 5.4 atau yang lebih baru dan tidak ingin menulis sendiri modul kriptografi, saya sarankan menggunakan perpustakaan yang ada yang menyediakan enkripsi terautentikasi . Perpustakaan yang saya tautkan hanya bergantung pada apa yang disediakan oleh PHP dan sedang ditinjau secara berkala oleh beberapa peneliti keamanan. (Termasuk saya.)
Jika tujuan portabilitas Anda tidak mencegah membutuhkan PECL ekstensi, libsodium adalah sangat dianjurkan atas apa-apa yang Anda atau saya bisa menulis di PHP.
Pembaruan (2016-06-12): Sekarang Anda dapat menggunakan sodium_compat dan menggunakan tawaran crypto libsodium yang sama tanpa menginstal ekstensi PECL.
Jika Anda ingin mencoba teknik kriptografi, baca terus.
Pertama, Anda harus meluangkan waktu untuk mempelajari bahaya enkripsi yang tidak diautentikasi dan Prinsip Kiamat Kriptografis .
Enkripsi dan Dekripsi
Enkripsi dalam PHP sebenarnya sederhana (kami akan menggunakan
openssl_encrypt()
danopenssl_decrypt()
setelah Anda membuat beberapa keputusan tentang cara mengenkripsi informasi Anda. Konsultasikanopenssl_get_cipher_methods()
untuk daftar metode yang didukung pada sistem Anda. Pilihan terbaik adalah AES dalam mode CTR :aes-128-ctr
aes-192-ctr
aes-256-ctr
Saat ini tidak ada alasan untuk percaya bahwa ukuran kunci AES adalah masalah signifikan yang perlu dikhawatirkan (lebih besar mungkin tidak lebih baik, karena penjadwalan kunci yang buruk dalam mode 256-bit).
Catatan: Kami tidak menggunakan
mcrypt
karena itu ditinggalkan dan memiliki bug yang belum ditonton yang mungkin mempengaruhi keamanan. Karena alasan ini, saya mendorong pengembang PHP lain untuk menghindarinya juga.Enkripsi Sederhana / Pembungkus Dekripsi menggunakan OpenSSL
Contoh Penggunaan
Demo : https://3v4l.org/jl7qR
Pustaka crypto sederhana di atas masih tidak aman untuk digunakan. Kita perlu mengautentikasi ciphertext dan memverifikasi sebelum kita mendekripsi .
Catatan : Secara default,
UnsafeCrypto::encrypt()
akan mengembalikan string biner mentah. Sebut seperti ini jika Anda perlu menyimpannya dalam format binary-safe (base64-encoded):Demo : http://3v4l.org/f5K93
Pembungkus Autentikasi Sederhana
Contoh Penggunaan
Demo : biner mentah , base64-encoded
Jika ada yang ingin menggunakan
SaferCrypto
perpustakaan ini di lingkungan produksi, atau implementasi Anda sendiri dari konsep yang sama, saya sangat menyarankan untuk menghubungi kriptografer penduduk Anda untuk pendapat kedua sebelum Anda melakukannya. Mereka akan dapat memberi tahu Anda tentang kesalahan yang bahkan mungkin tidak saya sadari.Anda akan jauh lebih baik menggunakan perpustakaan kriptografi terkemuka .
sumber
Gunakan
mcrypt_encrypt()
danmcrypt_decrypt()
dengan parameter yang sesuai. Sangat mudah dan lurus ke depan, dan Anda menggunakan paket enkripsi yang teruji pertempuran.EDIT
5 tahun dan 4 bulan setelah jawaban ini,
mcrypt
ekstensi sekarang dalam proses penghentian dan penghapusan akhirnya dari PHP.sumber
PHP 7.2 pindah sepenuhnya dari
Mcrypt
dan enkripsi sekarang didasarkan padaLibsodium
perpustakaan yang dapat dikelola .Semua kebutuhan enkripsi Anda pada dasarnya dapat diselesaikan melalui
Libsodium
pustaka.Dokumentasi Libsodium: https://github.com/paragonie/pecl-libsodium-doc
sumber
crypto_sign
API tidak tidak pesan mengenkripsi - yang akan membutuhkan salah satucrypto_aead_*_encrypt
fungsi.PENTING jawaban ini hanya berlaku untuk PHP 5, di PHP 7 menggunakan fungsi kriptografi bawaan.
Berikut ini adalah implementasi yang sederhana namun cukup aman:
Kode dan contoh ada di sini: https://stackoverflow.com/a/19445173/1387163
sumber