it-swarm-id.com

Kenapa kita tidak menggulung sendiri?

Mengapa kita tidak membuat skema keamanan kita sendiri?

Saya melihat banyak pertanyaan di sekitar sini tentang custom crypto dan mekanisme keamanan khusus, terutama seputar hashing kata sandi.

Dengan mengingat hal itu, saya mencari jawaban kanonik, dengan sifat-sifat berikut:

  • Mudah bagi seorang pemula untuk mengerti.
  • Jelas dan eksplisit dalam mengapa menggulirkan sendiri adalah ide yang buruk.
  • Memberikan contoh kuat.

xkcd Wajib.

255
Polynomial

Anda dapat memutar sendiri, tetapi Anda mungkin akan membuat kesalahan keamanan besar jika Anda bukan ahli dalam keamanan/kriptografi atau skema Anda dianalisis oleh banyak ahli. Saya lebih berani bertaruh pada skema enkripsi open-source yang dikenal publik yang ada untuk dilihat dan dianalisis oleh semua orang. Semakin banyak mata berarti semakin besar kemungkinan bahwa versi saat ini tidak memiliki kerentanan besar, dibandingkan dengan sesuatu yang dikembangkan sendiri oleh non-pakar.

Dari Phil Zimmermann's (pembuat PGP) Pengantar Kriptografi (Halaman 54) :

Ketika saya masih kuliah di awal tahun 70-an, saya merancang apa yang saya yakini sebagai skema enkripsi yang brilian. Aliran angka pseudorandom sederhana telah ditambahkan ke aliran plaintext untuk membuat ciphertext. Ini tampaknya akan menggagalkan setiap analisis frekuensi dari ciphertext, dan akan menjadi tidak dapat dipecahkan bahkan oleh badan intelijen pemerintah yang paling banyak akal. Saya merasa sangat puas dengan pencapaian saya.

Bertahun-tahun kemudian, saya menemukan skema yang sama ini di beberapa teks pengantar kriptografi dan makalah tutorial. Bagusnya. Kriptografer lain telah memikirkan skema yang sama. Sayangnya, skema ini disajikan sebagai tugas pekerjaan rumah sederhana tentang cara menggunakan teknik kriptanalitik dasar untuk memecahkannya. Begitu banyak untuk skema brilian saya.

Dari pengalaman yang merendahkan ini saya belajar betapa mudahnya jatuh ke rasa aman yang salah ketika merancang algoritma enkripsi. Kebanyakan orang tidak menyadari betapa sulitnya untuk merancang algoritma enkripsi yang dapat menahan serangan yang berkepanjangan dan ditentukan oleh lawan yang banyak akal.

(Ini pertanyaan memiliki diskusi lebih lanjut tentang kutipan di atas.)

Jika Anda tidak yakin dengan "Jangan Roll Your Own [Kriptografi/Keamanan]", maka Anda mungkin bukan ahli dan ada banyak kesalahan yang kemungkinan Anda akan lakukan.

Apakah aplikasi Anda kuat terhadap:

  • Serangan Wakt . E.g., ke nanodetik apakah kunci benar-benar buruk dan kunci sebagian buruk mengambil jumlah waktu yang sama dalam agregat untuk gagal? Jika tidak, informasi waktu ini dapat dieksploitasi untuk menemukan kunci/kata sandi yang benar.

  • Serangan Kekerasan Trivial ; mis., itu dapat dilakukan dalam hitungan detik hingga tahun (ketika Anda khawatir akan rusak dalam beberapa tahun). Mungkin ide Anda tentang keamanan mungkin peluang 1 dalam sejuta (1.000.000) untuk menerobos (bagaimana jika seseorang dengan bot bersih mencoba beberapa miliar kali?). Ide saya adalah bertujuan untuk sesuatu seperti 1 in ~ 2128 (34 000 000, 000, 000, 000, 000, 000, 000), yang kira-kira sepuluh juta miliar miliar kali lebih aman dan benar-benar di luar bidang menebak jalan masuk Anda.

  • Serangan pada akun pengguna secara paralel; mis., Anda dapat meng-hash kata sandi dengan 'garam' yang sama (atau lebih buruk tidak) pada semua hash kata sandi di database seperti apa yang terjadi dengan hash yang bocor LinkedIn .

  • Menyerang setiap akun khusus secara sepele. Mungkin ada garam acak unik dengan masing-masing kata sandi hash (mis. MD5/SHA1/SHA2), tetapi karena Anda dapat mencoba miliaran kata sandi yang mungkin pada hash setiap detik, jadi gunakan daftar kata sandi umum, serangan kamus, dll. hanya perlu satu detik penyerang untuk memecahkan sebagian besar akun. Gunakan hash kriptografi yang kuat seperti bcrypt atau PBKDF2 untuk menghindari atau memperkuat hash biasa dengan faktor yang sesuai (biasanya 10(3-8)).

  • Menyerang nomor yang dapat ditebak/lemah "acak". Mungkin Anda menggunakan microtime/MT-Rand atau informasi yang terlalu sedikit untuk seed nomor semu acak seperti Debian OpenSSL lakukan beberapa tahun yang lal .

  • Menyerang yang memintas perlindungan. Mungkin Anda melakukan hashing/input sisi klien validasi dalam aplikasi web dan ini dilewati oleh pengguna mengubah skrip. Atau Anda memiliki aplikasi lokal yang klien coba jalankan dalam mesin virtual atau membongkar untuk merekayasa balik/mengubah memori/atau cara curang entah bagaimana.

  • Serangan lain, termasuk (tetapi tidak berusaha menjadi daftar lengkap) CSRF , XSS =, injeksi SQL , jaringan menguping, serangan replay , Man in the Middle attacks , buffer overflows , dll. Perlindungan terbaik sangat cepat dirangkum.

    • CSRF: memerlukan token CSRF yang dihasilkan secara acak di POST tindakan; XSS: selalu memvalidasi/melarikan diri dari input pengguna yang tidak dipercaya sebelum memasukkan ke dalam basis data dan menampilkannya ke pengguna/browser.
    • SQLi: selalu gunakan parameter terikat dan batasi berapa banyak hasil yang dikembalikan.
    • Menguping: mengenkripsi lalu lintas jaringan yang sensitif.
    • Putar ulang: masukkan satu kali nonces unik dalam setiap transaksi.
    • MitM: Web of Trust/Sama dengan situs yang terakhir dikunjungi/Sertifikat yang dikeluarkan oleh CA tepercaya.
    • Buffer overflows: bahasa pemrograman yang aman/perpustakaan/perlindungan ruang yang dapat dieksekusi/dll).

Anda hanya sekuat tautan terlemah yang dapat dieksploitasi. Juga hanya karena Anda tidak menggulirkan skema Anda sendiri, tidak berarti skema Anda akan aman, sangat mungkin bahwa orang yang membuat apa yang Anda buat bukan ahli, atau membuat skema yang sebaliknya lemah.

233
dr jimbob

Ada sebuah rumah di daerah saya dengan dek yang sangat bagus di luar ruang keluarga lantai dua. Itu terlihat membengkak, sampai Anda masuk ke bawah dan melihat bagaimana itu dibangun. Tampaknya pemilik rumah memutuskan dia tidak perlu membayar banyak uang kepada pembangun atau arsitek untuk memberitahunya bagaimana membangun sebuah dek. Dia membangunnya sendiri dan itu tampak seperti jaring laba-laba kacau di bawah 2x4. Ini [~ # ~] mungkin [~ # ~] akan baik-baik saja. Secara pribadi, saya lebih suka tidak mempertaruhkan nyawa dan mengambil risiko pada pekerjaan konstruksi amatir seperti itu.

Saya pikir jika Anda ingin mengembangkan algoritma untuk melakukan enkripsi, Anda harus melakukannya dan bersenang-senang. Saya tidak akan merekomendasikan menggunakannya untuk menyembunyikan laporan bank online Anda tetapi jika Anda ingin mengenkripsi surat cinta teman perempuan Anda di komputer di rumah Anda, itu boleh saja — asalkan istri Anda bukan seorang cryptanalyst.

Ada sebuah cerita di “The American Black Chamber” * tentang Angkatan Laut yang mengembangkan sandi mereka sendiri. Angkatan Laut akan menunjukkan cryptosystem baru mereka, senang dengan diri mereka sendiri dan Yardley, analis Angkatan Darat, akan segera memecahkan kode, menjelaskan apa yang telah mereka lakukan salah. Mereka akan menawarkan untuk memperbaiki kode tetapi Yardley menunjukkan bahwa sementara mereka dapat memperbaiki kelemahan spesifik, tanpa pemahaman yang kuat, mereka akan selalu memiliki masalah. Sistem mereka secara intrinsik cacat. Ini seperti menambal atap yang bocor. Anda dapat menambal selamanya tetapi air masih akan menemukan jalan masuk. Jika Anda tidak ingin basah, atap perlu dibangun oleh seseorang yang tahu sedikit tentang atap.

Apakah saya pernah bercerita tentang operasi otak do-it-yourself yang saya lakukan pada ibu mertua saya? Semuanya berjalan baik sampai dia pergi dan mati. Serius, beberapa dari kita akan mempercayai kesehatan kita kepada dokter amatir; apakah Anda benar-benar ingin mempercayai rahasia Anda ke perangkat lunak amatir? Saya benci mengakuinya tetapi saya membeli tiket lotere setiap beberapa bulan. Saya sepenuhnya berharap untuk kehilangan tetapi kemungkinan pembayaran sangat besar. Saya bisa bermain peluang dan mungkin saya akan keluar di depan. Jika saya tidak melakukannya, saya keluar uang. Mengapa memainkan peluang pada enkripsi? Pembayaran tidak ada di sana.

Salam,/Bob Bryan

  • Direkomendasikan: Herbert O. Yardley, "The American Black Chamber" - Sebuah buku yang menarik hari ini seperti ketika ditulis pada tahun 1931. "The American Black Chamber dipenuhi dengan cerita-cerita bagus yang diceritakan dengan baik, serta deskripsi yang jujur ​​tentang keberhasilan Yardley dalam pembacaan sandi. Itu adalah buku terlaris pada tahun 1932 - di luar negeri maupun di dalam negeri. ” Dari NSA: Tinjauan Pearl Harbor - The Black Chamber
63
Bob Bryan

Bruce Scheier wrote kembali pada tahun 1998:

Siapa pun, dari amatir yang tidak mengerti apa-apa hingga ahli kriptografi terbaik, dapat membuat algoritma yang tidak dapat ia hancurkan. Itu bahkan tidak sulit. Yang sulit adalah menciptakan algoritma yang tidak dapat dipecahkan orang lain, bahkan setelah bertahun-tahun analisis. Dan satu-satunya cara untuk membuktikannya adalah dengan melakukan algoritma analisis selama bertahun-tahun oleh para kriptografer terbaik di sekitar.

Cory Doctorow menjuluki konsep ini "Hukum Schneier" pada tahun 2004 pidato :

Siapa pun dapat menciptakan sistem keamanan yang sangat pintar sehingga dia tidak bisa memikirkan bagaimana cara melanggarnya.

Sebagai tindak lanjut, ini , lagi dari Schneier:

Ketika seseorang memberi Anda sistem keamanan dan berkata, "Saya yakin ini aman," hal pertama yang harus Anda tanyakan adalah, "Siapa kamu?" Tunjukkan pada saya apa yang telah Anda langgar untuk menunjukkan bahwa pernyataan Anda tentang keamanan sistem berarti sesuatu.

Phil Zimmerman juga menulis dalam bukunya makalah PGP asli :

Ketika saya masih kuliah di awal tahun tujuh puluhan, saya merancang apa yang saya yakini sebagai skema enkripsi yang brilian. Aliran angka pseudorandom sederhana telah ditambahkan ke aliran plaintext untuk membuat ciphertext. Ini tampaknya akan menggagalkan setiap analisis frekuensi dari ciphertext, dan akan tidak dapat dipecahkan bahkan oleh badan intelijen Pemerintah yang paling banyak akal. Saya merasa sangat puas dengan pencapaian saya. Sangat yakin.

Bertahun-tahun kemudian, saya menemukan skema yang sama ini di beberapa teks pengantar kriptografi dan makalah tutorial. Bagusnya. Kriptografer lain telah memikirkan skema yang sama. Sayangnya, skema ini disajikan sebagai tugas pekerjaan rumah sederhana tentang cara menggunakan teknik kriptanalitik dasar untuk memecahkannya. Begitu banyak untuk skema brilian saya.

59
tylerl

Posting asli meminta contoh:

The Babington Plot adalah cerita bagus tentang cryptosystem yang buruk yang menyebabkan masalah. Mary Queen of Scots dipenjara oleh sepupunya Ratu Elizabeth I dan berkomunikasi dengan orang-orang di luar melalui surat-surat terenkripsi. Alfabet digantikan dengan cryptoalphabet dari coretan, lingkaran silang dan segitiga dengan huruf tambahan yang ditetapkan untuk huruf umum, seperti e, t, i dan o sehingga makna huruf tidak dapat ditemukan dengan cepat dengan analisis frekuensi. Mereka juga menambahkan beberapa karakter nol yang diabaikan pada dekripsi untuk membuang analis. Masalahnya adalah bahwa sang Ratu memiliki cryptanalyst yang sangat kompeten pada stafnya dalam pribadi Thomas Phelippes yang mampu mendekripsi pesan ketika mereka dicegat.

Ketika segala sesuatunya berkembang, Mary pergi bersama komplotan untuk melarikan diri dan mengambil alih takhta. Ketika agen Ratu mencegat surat terakhir dari Mary sebelum meneruskannya, mereka menambahkan kalimat terenkripsi yang menanyakan nama-nama mereka yang terlibat dalam plot "sehingga mereka dapat diberi hadiah dengan benar." Koresponden Mary dengan patuh menjawab dan agen-agen The Queen membuat semua orang terlibat dieksekusi.

Ketika anak-anak saya masih kecil, saya akan mengirimi mereka cryptogram dengan makan siang mereka (dengan kunci (menggunakan cipher Vernam)). Secara umum, itu adalah lelucon tetapi tidak pernah penting. Dalam kasus seperti itu, roll milikmu baik-baik saja. Jika Anda berencana untuk menggulingkan Ratu Inggris (atau Shah Iran atau Thug-ocracy yang direformasi secara perlahan di Myanmar), saya akan menyarankan agar Anda memastikan bahwa apa yang Anda gunakan tidak dapat dengan mudah didekripsi. Seperti yang dikatakan Bruce Schneier , siapa pun dapat membuat cryptosystem yang tidak dapat mereka dekripsi, tetapi menghasilkan satu yang tidak dapat didekripsi oleh orang lain lebih sulit.

45
Bob Bryan

Saya akan memberikan contoh sesuatu yang terjadi di sini tempat saya bekerja. Seorang rekan kerja saya bertanggung jawab untuk merancang sistem penyimpanan kata sandi (panjang lebar, jangan tanya) untuk akun FTP perusahaan. Saya diminta untuk mengambil alih, dan hal pertama yang saya lihat adalah:

public string Encrypt(string rawText)
{
    // homebrew code here
}
public string Decrypt(string encrypted)
{
    // homebrew code here
}

Saya segera merobeknya, menggantinya dengan panggilan perpustakaan kriptografi standar - dan ketika saya ditanyai, saya menjawab:

"Anda tidak pernah menggulung rutin enkripsi Anda sendiri."

Rekan kerja saya melawan saya selama berjam-jam. Dia telah menghabiskan banyak waktu di atasnya, membuatnya sempurna, sehingga seorang penyerang tidak bisa mungkin punya cara untuk memecahkannya . Pada satu titik, mereka bahkan berkata, "Ini lebih aman daripada AES256, karena tidak ada yang tahu cara kerjanya."

Pada saat itu, saya tahu dua hal:

  • Rekan kerja saya adalah contoh sempurna dari efek Dunning Kruger (kurangnya pengetahuan tentang suatu subjek sehingga lebih mungkin melebih-lebihkan kemampuan mereka sendiri)
  • Rekan kerja saya harus dikoreksi. Bukan hanya karena mereka "salah", tetapi karena mereka bertanggung jawab untuk merancang sistem lainnya, dan saya tidak ingin mereka tetap membuat enkripsi pembuatan rumah.

Jadi saya menyisihkan kodenya. Dan sebagai gantinya, saya mencoba memecahkan kode rutin dengan hanya memanggil fungsi Encrypt () dan memeriksa hasilnya. Saya seorang pemula - saya bukan seorang cryptoanalyst - tetapi saya hanya butuh 4 jam. Saya menunjukkan celah pada mereka, menapaki langkah saya, dan mengulangi: Jangan pernah menggulung enkripsi Anda sendiri. Semoga mereka akan mengingatnya dan tidak akan melakukannya lagi.

Jadi intinya adalah:

  1. Seberapa yakin Anda terhadap keamanan enkripsi Anda tidak mendukung seberapa aman sebenarnya itu.
  2. Jangan pernah gulung enkripsi Anda sendiri (tidak cukup sering diulang ...)
13
Kevin

Dalam kriptografi, Anda tidak hanya memiliki satu lawan yang menyerang Anda seperti yang Anda harapkan. Inilah yang membuatnya sulit untuk dipikirkan, karena Anda harus memikirkan SEMUANYA.

Tapi sungguh, tidak ada yang bisa mengakali setiap lawan yang mungkin. Yang terbaik yang bisa kita lakukan adalah memanfaatkan pengetahuan umum kita dan penelitian yang ada sebanyak mungkin dan mengambil langkah kecil untuk membangun dari sana, serang vektor oleh serang vektor.

Ini adalah bagaimana banyak masalah di ambang kemampuan manusia didekati, baik itu penelitian dalam fisika atau bermain catur di level tertinggi.

Dalam bidang tesis ini Anda juga dapat mengabaikan apa yang sedang dikerjakan orang lain dan menyusun strategi dan teori Anda sendiri, dan jika Anda bertemu lawan terampil pertama Anda, Anda akan dilenyapkan oleh keadaan seni dengan lebih banyak cara yang dapat Anda hitung.

TL; DR
Manusia terlalu bodoh untuk melakukan kriptografi sendirian.

13
mschwaig

Secara umum tidak mungkin untuk menjamin bahwa seseorang yang mendesain suatu cryptosystem tidak akan meninggalkan perusahaan yang membuatnya, dan menggunakan pengetahuan mereka tentang desain tersebut untuk merugikan mantan majikan mereka, kecuali dengan merancang cryptosystem sedemikian rupa sehingga setiap pengetahuan seperti itu yang diperoleh musuh dapat dianggap tidak berguna.

Jika seseorang memiliki cryptosystem yang aman bahkan terhadap penyerang yang tahu segalanya kecuali kunci, dan satu mengubah kunci ke nilai baru yang dihasilkan secara acak, maka sistem akan aman terhadap penyerang yang tidak memiliki kunci baru. Bahkan jika penyerang memiliki informasi yang cukup untuk mengkompromikan sistem sebelum kunci diubah, mereka tidak akan dapat merusak sistem setelahnya.

Kecuali jika suatu sistem perlu melindungi data berharga yang tidak biasa, mungkin tidak terlalu sulit untuk merancang suatu cryptosystem menjadi cukup baik sehingga, tanpa sepengetahuan orang dalam, biaya cracking akan melebihi nilai apa pun yang bisa diperoleh dengan melakukan hal itu. Bukan karena merancang kripto yang baik itu mudah, tetapi karena sebagian besar sistem tidak digunakan untuk menjaga apa pun yang bernilai bagi penyerang (bahkan jika seorang kriptografer yang ahli dapat dengan mudah memecahkan suatu sistem dalam 58 menit, itu tidak akan jauh dari risiko kecuali nilai informasi tersebut untuk penyerang akan melebihi biaya waktu cryptographer).

Merancang sistem sehingga dapat dibuat kuat terhadap seseorang dengan data orang dalam, bagaimanapun, jauh lebih sulit, dan ada sangat sedikit orang dengan keahlian yang cukup untuk merancang sistem yang bisa - dengan mengubah kunci - dibuat kuat oleh seseorang yang memiliki pengetahuan mendalam tentang desain dan keahlian dalam kriptografi. Seorang ahli kriptografi tanpa pengetahuan orang dalam mungkin harus memeriksa ratusan atau ribuan potensi kesalahan yang bisa dilakukan oleh seorang desainer, tetapi pengetahuan orang dalam mungkin memungkinkan orang itu untuk mengidentifikasi dan mengeksploitasi kesalahan dengan segera.

1
supercat

Sebenarnya, Gulung crypto Anda Sendiri, lalu buang.

Ketika Crypto Fails memanggil, agak sulit untuk mengatakan bahwa Anda tidak dapat menulis kode kripto sama sekali. Masalah utama adalah untuk tidak mengambil kode itu dan menggunakannya di mana saja (dalam perangkat lunak yang dirilis).

Anda harus mencobanya dan menggunakannya sebagai pengalaman belajar. Bahkan lebih baik jika Anda berteman dengan seorang cryptanalyst, dan dapat memperoleh umpan balik dari apa yang Anda tulis. Jika mereka layak dihargai, mereka juga akan memberi tahu Anda untuk tidak menggunakan kode dalam kehidupan nyata, tetapi mereka harus dapat memberi Anda beberapa informasi yang akan membantu Anda belajar dan tumbuh.

0
NH.