Apa yang harus diketahui oleh programmer web tentang kriptografi? [Tutup]

27

Haruskah programmer yang membuat situs web / aplikasi web memahami kriptografi? Saya tidak tahu bagaimana kebanyakan algoritma kriptografi bekerja, dan saya benar-benar tidak mengerti perbedaan antara md5 / des / aes / etc. Adakah di antara Anda yang merasa perlu untuk memahami kriptografi secara mendalam?

Saya belum membutuhkannya, tetapi saya bertanya-tanya apakah mungkin saya kehilangan sesuatu. Saya telah menggunakan hash garam + md5 untuk mengenkripsi kata sandi, dan saya memberi tahu webservers untuk menggunakan SSL. Di luar itu, saya tidak bisa mengatakan saya telah menggunakan banyak hal lain, saya juga tidak bisa mengatakan dengan pasti seberapa aman metode ini. Saya hanya menggunakannya karena orang lain mengklaim mereka aman.

Pernahkah Anda menemukan kebutuhan untuk menggunakan kriptografi dalam pemrograman web selain dari dua contoh sederhana ini?

davidhaskins
sumber
4
Mereka harus cukup tahu untuk tahu bahwa mereka seharusnya tidak melakukannya.
SLaks
@SLaks: +1 100% setuju. Saya menulis jawaban untuk utas ini untuk memperluas mengapa ini.
Chris Jester-Young

Jawaban:

41

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.

Chris Jester-Young
sumber
4
luar biasa. menyukai posting blog yang terhubung dengan "pikirkan lagi". chargen.matasano.com/chargen/2007/9/7/…
davidhaskins
+1, tetapi menggunakan kunci simetris yang sama beberapa kali baik-baik saja. Itulah gunanya IV (jika tidak, Anda tidak akan membutuhkannya).
orip
1
Selain itu, Colin Percival dari ketenaran scrypt (dan lainnya) memiliki artikel hebat yang disebut "Cryptographic Right Answers" yang menjabarkan keputusan crypto roti dan mentega yang perlu Anda buat. SSL sangat bermasalah (pencabutan kunci sangat sulit untuk diterapkan). Info lebih lanjut di sini: daemonology.net/blog/...
orip
@orip Setuju, meskipun saya akan mengatakan bahwa menggunakan kunci yang sama dengan IV berbeda biasanya lebih bermanfaat untuk kasus di mana pesan Anda lebih panjang dari ukuran blok simetris cipher yang Anda pilih, daripada untuk pesan yang berbeda, di mana Anda tidak akan memiliki konteks untuk melacak infus yang digunakan untuk pesan sebelumnya. Juga, setuju dengan artikel Colin Percival.
Chris Jester-Young
1
@Senang Saya telah mengubah tautan ke sesuatu yang lebih relevan.
Chris Jester-Young
14

Anda tidak perlu tahu apa-apa selain dasar-dasar tentang kriptografi (apa itu hash, apa itu garam, kira-kira seberapa sulit untuk memecahkan enkripsi ini atau itu dan seterusnya), tetapi Anda harus tahu sedikit tentang keamanan di umum.

Area keamanan utama yang harus Anda perhatikan sebagai pengembang web:

  1. Injeksi SQL. Ini mungkin lubang tunggal paling berbahaya yang bisa ditinju pengembang web pada sistem.
  2. Script dan cookie lintas situs.
  3. Spambot dan captcha.
  4. Injeksi SQL. Tidak dapat ditekankan betapa pentingnya hal ini.
biziclop
sumber
Tidak memahami apa pun tentang apa yang Anda lakukan sangat berbahaya. Tidak tahu apa perbedaan antara hash intisari pesan dan hash kriptografis dapat merusak Anda. Tidak tahu bagaimana garam bisa menghancurkan Anda.
Incognito
@ user1525 Itulah yang saya maksud sebagai dasar-dasar kriptografi. Anda pasti tidak perlu tahu bagaimana sebenarnya algoritma enkripsi bekerja.
biziclop
Saya menghargai tanggapannya, dan saya setuju tentang injeksi SQL dan serangan lainnya, tetapi saya benar-benar bertanya tentang kriptografi.
davidhaskins
2
@davidhaskins Ya, saya hanya berpikir itu layak ditunjukkan, karena setiap level dibangun di atas yang sebelumnya. Mengetahui cara kerja AES tidak ada artinya jika Anda gagal mengamankan aplikasi pada tingkat yang lebih dasar. Dalam pengalaman saya ini adalah jebakan banyak pengembang jatuh (saya melakukannya beberapa kali), untuk berkonsentrasi pada enkripsi dan kehilangan perannya dalam rantai panjang keamanan.
biziclop
4

Saya ingat melihat ceramah ini berjudul Apa yang Harus Diketahui Setiap Insinyur tentang Keamanan dan Di mana Mempelajarinya , pembicara adalah Neil Daswani dan itu adalah Google Tech Talk yang diberikannya, mungkin tempat yang baik untuk memulai!

Tidak berlaku hanya untuk Pemrogram Web, mungkin pertanyaannya harus berjudul kembali "Apa yang harus diketahui pemrogram tentang keamanan?" karena mereka tidak perlu tahu lebih banyak daripada dasar-dasar tentang Kriptografi (semenarik mungkin)


sumber
2

Crypto sangat berguna dalam banyak situasi. Contoh yang kami gunakan adalah mengenkripsi cookie sesi yang dibuat dan ditetapkan oleh host Win / IIS untuk digunakan pada host LAMP.

Jika Anda ingin menerapkan enkripsi (sebagai lawan dari hashing md5 / sha1), beberapa istilah dasar penting - seperti perbedaan antara enkripsi simetris dan asimetris. Seiring dengan memahami perbedaan antara keduanya, Anda harus mengembangkan pemahaman tentang apa yang Anda sebagai pengembang web perlu lakukan untuk menyimpan dan mengamankan kunci dekripsi dengan benar. Misalnya, jika mengembangkan aplikasi yang akan digunakan pada host di mana Anda tidak memiliki kontrol administratif penuh, seperti host bersama, vs menggunakan pada server di mana semua admin dikenal dan dipercaya.

Michael
sumber
2

Menurut pendapat saya, Anda harus tahu segalanya tentang kriptografi yang akan diketahui seseorang yang menyerang kode Anda. Anda harus memahami hash, garam, non-acak, algoritma enkripsi utama (RSA, 3DES, AES, dll), SHA-1 / MD-5 / et al. Anda tidak harus mengingatnya, tetapi Anda setidaknya harus tahu bahwa efektivitas algoritma hash dan cara membuatnya lebih kuat. Anda harus tahu apa tabrakan dan positif palsu. Anda seharusnya tidak bisa membaca algoritma enkripsi, tetapi Anda harus terbiasa dengan tolok ukurnya, mana yang ideal untuk skenario mana. Anda harus dapat menjelaskan dan menjelaskan enkripsi simetris vs asimetris dan kapan menggunakannya. Anda harus tahu apa itu PKI dan bagaimana PKI digunakan. Anda harus tahu apa itu otoritas sertifikat dan bagaimana interaksi dengan server Anda.

Mengetahui seluk beluk segalanya tidak sepenting mengetahui latar belakangnya. Apa tolok ukur hal-hal tertentu (seberapa cepat, seberapa kuat, kelemahan, dll).

Rekomendasi ini untuk informasi tingkat senior atau arsitek. Jika Anda hanya monyet web mendayung dayung, Anda tidak perlu tahu semua ini. Arsitek Anda harus mengetahui hal ini. Jika Anda bertanggung jawab atas situs, merancang, mengimplementasikannya, dll ... maka Anda harus terbiasa dengan semua konsep ini dan dapat berkomunikasi secara cerdas tentang mereka. Anda tidak harus bisa mengajarkannya, cukup terima dan sebarkan informasi tentangnya.

Joel Etherton
sumber
2

Anda harus menggunakan bcrypt (Blowfish) untuk menyimpan kata sandi dan bukan MD5; ini adalah algoritma yang jauh lebih lambat , yang artinya jauh lebih sulit untuk ditebak dan diperiksa oleh peretas. Selain itu, bcrypt menggunakan faktor kerja sebagai parameter, yang berarti ia bisa menjadi lebih lambat saat komputer baru diperkenalkan, sehingga memiliki built-in proofing di masa depan.

Lihat Cara Menyimpan Kata Sandi Secara Aman untuk info lebih lanjut.

chrisaycock
sumber
0

Sebagai jawaban yang cukup umum untuk pertanyaan-pertanyaan semacam ini saya selalu berpikir bahwa Anda harus mencoba untuk memiliki pemahaman dasar tentang apa pun yang terkait dengan apa yang Anda lakukan dari jarak jauh. Tentu saja Anda membutuhkan pengetahuan rinci khusus tentang apa yang sebenarnya sedang Anda kerjakan. Sangat sulit untuk memprediksi bagaimana suatu daerah tertentu akan berevolusi, apa yang akan menjadi "dalam mode" atau apa yang Anda butuhkan di masa depan, sehingga memiliki area yang luas yang setidaknya Anda "dengar" akan tetap ada banyak pintu terbuka.

Sejauh pengalaman pribadi saya dalam pemrograman web, saya menemukan gagasan dasar tentang kriptografi asimetris dan hal-hal yang membantu untuk memahami apa yang terjadi di bawah tenda. Saya bisa bertahan hidup tanpa itu tetapi saya harus mengatakan saya menikmati kriptografi dan matematika jadi mengapa tidak.

Omar Kohl
sumber