Pemrogram web harus tahu bahwa mereka seharusnya tidak pernah mencoba menerapkan kriptografi sendiri.
Secara khusus, itu berarti bahwa tidak ada pakar non-keamanan yang boleh menyentuh primitif kriptografi secara langsung. Mereka seharusnya tidak berpikir di tingkat AES, SHA-1, dll. Sebaliknya, mereka harus menggunakan fungsi tingkat tinggi untuk mengenkripsi dan menandatangani pesan, dan untuk kata sandi "hash".
Mengapa? Karena kalau tidak, orang akan tersesat untuk berpikir bahwa:
- AES-256 adalah "enkripsi hebat", terlepas dari kenyataan bahwa mereka menggunakannya dalam mode ECB, atau menggunakan nilai-nilai IV non-acak, dll. (Dalam beberapa mode, infus non-acak tetapi unik tidak apa-apa. Pada yang lain, tidak banyak.)
- Mereka dapat menggunakan kunci simetris yang sama untuk mengenkripsi beberapa pesan (atau lebih buruk, menyimpan kunci simetris dalam kode untuk penggunaan langsung).
- Mereka bahkan mungkin memutuskan untuk menggunakan kata sandi sebagai kunci secara langsung, tanpa menggunakan fungsi derivasi kunci.
- Mereka dapat menggunakan RSA untuk mengenkripsi data secara langsung.
- Mereka hanya dapat "memberi garam dan MD5" kata sandi mereka untuk menjaga mereka tetap aman. (Jika Anda berpikir tabel pelangi adalah tautan terlemah, pikirkan lagi .)
Hanya untuk berada di halaman yang sama, tidak satupun dari item di atas baik-baik saja . Jika Anda tidak mendapatkan itu, maka Anda seharusnya tidak menyentuh crypto dengan tiang 10 kaki! (AES-256 adalah enkripsi yang hebat, tetapi hanya jika Anda menggunakannya dengan benar. "Ini bukan ukuran yang penting, itu yang Anda lakukan dengan itu." :-))
Apa fungsi tingkat tinggi yang saya bicarakan? Saya pribadi merekomendasikan penggunaan perpustakaan OpenPGP (untuk data saat istirahat) atau SSL (untuk data bergerak). Protokol-protokol ini secara kaku menentukan penggunaan yang benar dari algoritma asimetris, simetris, dan hash. Misalnya, dengan OpenPGP:
- Itu tidak menggunakan RSA untuk mengenkripsi data secara langsung, tetapi sebaliknya menghasilkan kunci sesi (simetris) acak per pesan (ini penting), dan menggunakan RSA untuk mengenkripsi kunci sesi itu.
- Ia menggunakan fungsi derivasi kunci untuk mengubah frasa sandi menjadi kunci. (Dalam bahasa OpenPGP, ini disebut S2K, tapi saya pikir "fungsi derivasi kunci" adalah istilah yang lebih standar.)
- Ini menangani memilih mode yang baik, sehingga Anda tidak akan pernah berakhir menggunakan ECB.
- Ini menangani manajemen kunci untuk Anda, jadi Anda tidak perlu membuat keputusan ad-hoc tentang kunci mana yang dapat dipercaya, dll.
Rangkuman: jika Anda bukan ahli keamanan, dan Anda berpikir pada level AES, atau SHA-1, atau MD5, Anda melakukan kesalahan . Gunakan pustaka yang ditulis oleh pakar keamanan (seperti Bouncy Castle), yang mengimplementasikan protokol yang dirancang oleh pakar keamanan (seperti OpenPGP untuk enkripsi, atau bcrypt atau scrypt untuk hashing kata sandi), alih-alih menggulirkan sendiri.
Saya bukan ahli crypto dengan cara apa pun, tetapi saya cukup tahu untuk tidak mencoba merancang protokol ad-hoc saya sendiri. Supaya jelas, seluruh posting ini adalah materi Kriptografi 101 . Jadi, jika posting ini tidak 100% masuk akal bagi Anda, maka Anda pasti tidak perlu mendekati kriptografi.