Apa alasan utama untuk menulis kode yang tidak jelas, dalam hal manfaat nyata bagi orang-orang yang mengembangkan kode, dan bisnis yang menjalankan kode itu (jika kode tersebut sebenarnya adalah kode komersial)? Apakah ada kasus yang terdokumentasi (tersedia online di beberapa lokasi) yang menggambarkan kapan kebingungan lebih baik daripada buruk? Apakah ada contoh terkenal di mana, misalnya, kebingungan terbukti secara bermakna menunda pihak ke-3 berbahaya dari mendapatkan kode? Sepertinya, seperti menggulung jendela mobil Anda tidak akan menghentikan orang untuk merusaknya dan mencuri stereo Anda, mengaburkan kode Anda hanya membuat orang jujur jujur.
=========
Latar Belakang:
Ini adalah upaya untuk dengan sengaja menantang asumsi saya tentang topik ini.
Saya menentang penggunaan kode kebingungan secara umum, tetapi saya ingin tahu apakah saya melewatkan sesuatu. Saya mengerti mengapa, dalam kasus-kasus seperti JavaScript, minifikasi membantu hal-hal memuat lebih cepat dan semua (ada manfaat nyata, fungsional di sana), tapi sepertinya saya tidak dapat menemukan satu alasan mengapa kode kebingungan, untuk tujuan menjadi penghalang untuk menemukan apa yang dilakukan oleh bagian kode / algoritma , sebenarnya efektif untuk tujuan apa pun.
Dengan open source menjadi populer gila, pertanyaannya tampaknya "berbagi kode, atau tetap milik?" Ketika datang ke kode komersial, saya bisa mengerti mengapa Anda tidak bisa berbagi semuanya, dan Anda punya hukum di pihak Anda untuk memerangi pencurian.
BTW, jika alasan seseorang menulis kode yang dikaburkan adalah "keamanan pekerjaan" maka saya akan memecat setiap programmer yang ditemukan secara konsisten, dan sengaja menggunakan kebingungan dengan satu-satunya tujuan membantu mempertahankan pekerjaan mereka, kecuali mereka secara wajar dapat menunjukkan bahwa ia memiliki beberapa manfaat bisnis. Benar-benar anti-tim sehingga konyol, dan menunjuk seseorang yang lebih peduli menjaga pekerjaan mereka melalui praktik yang salah arah, kemudian menjaganya karena mereka menulis perangkat lunak yang luar biasa.
Saya hanya menyebutkan kasus khusus ini karena, sementara saya menyadari orang-orang biasanya bercanda, saya ingin mencegah setiap jawaban yang dorongan dasarnya adalah bahwa kebingungan untuk keamanan kerja saja adalah ide yang bagus.
sumber
Jawaban:
Satu kasus penggunaan yang sangat menarik untuk kebingungan adalah menelusuri asal mula salinan ilegal. Dengan anggapan bahwa kebingungan adalah operasi yang relatif murah, penulis asli dapat memasok setiap klien dengan versi aplikasi yang berbeda, jika salinan terlarang ditemukan, penulis dapat membandingkan dengan versi yang disediakan dan melacak kembali sumber pembajakan.
Itu adalah bentuk steganografi , yang diilhami dan dalam variasi skema kriptografi "pengkhianat" . Saya tidak tahu apakah itu umum 1 , atau bahkan jika itu ide yang baik, tetapi saya sudah melihatnya diterapkan dalam praktik di bawah parameter berikut:
Alasannya tentu saja keamanan melalui ketidakjelasan pada awalnya, dan itu berkembang pada skema yang disebutkan di beberapa titik 2 . Kedua vendor memiliki akses ke kode biner masing-masing, secara hukum, dan saya pikir sudah jelas bahwa upaya dekompilasi dari keduanya diharapkan. Kebingungan tidak melakukan apa-apa dalam hal keamanan, dalam jangka panjang. Kedua vendor memiliki tim yang sangat termotivasi dan berbakat, bekerja di pasar yang sangat menguntungkan dan niche, pada akhirnya produk kami lebih mirip daripada tidak, dan setiap keunggulan kompetitif diperoleh melalui cara lain yang kurang jelas.
Saya tidak dapat benar-benar berkembang, karena (a) itu sangat awal dalam karir saya dan saya tidak mendapatkan gambaran yang jelas tentang keputusan desain atau hasil dari skema penelusuran (jika ada) dan (b) beberapa keterlibatan saya dengan proyek itu di bawah NDA.
Kasus penggunaan lain yang valid untuk kebingungan dapat terjadi ketika Anda, entah bagaimana, secara hukum wajib menyerahkan kode Anda kepada pihak ketiga :
IANAL, dan tautannya lebih relevan dengan hard copy kode daripada kode kerja yang sebenarnya, jadi ini mungkin sama sekali tidak relevan.
Sekarang, karena Javascript adalah contoh kanonik untuk kebingungan, ada satu efek samping yang tidak umum dipertimbangkan, dan itu menyembunyikan kode berbahaya di Javascript yang dikaburkan. Meskipun ada keuntungan yang pasti dalam mengecilkan 3 Javascript, saya tidak melihat titik dalam kebingungan yang sebenarnya dan saya senang Douglas Crockford setuju dengan saya :
Adapun kebingungan untuk "keamanan pekerjaan", itu adalah perilaku yang seharusnya tidak pernah melewati tinjauan kode, dan jika diidentifikasi tidak boleh ditoleransi. Saya tidak akan pergi sejauh menembakkan pelakunya pada awalnya, tapi pelanggar berulang pasti pantas dipukul, setidaknya.
Sebagai kesimpulan, kebingungan adalah contoh khas dari keamanan melalui ketidakjelasan, hanya kebaikan yang jelas adalah sebagai pencegah dan tidak lebih. Mungkin ada kasus penggunaan kreatif 4 yang saya tidak tahu, tetapi secara umum manfaatnya minimal, paling-paling.
1 Setelah menulis ini saya menemukan jawaban ini yang pada dasarnya menggambarkan skema yang sama, jadi mungkin lebih umum yang saya pikirkan.
2 Meskipun steganografi masih aman melalui ketidakjelasan.
3 Minifikasi ~ menghapus spasi putih dan memperpendek token, tidak sengaja dikaburkan.
4 Apakah Kontes Kode C Internasional Dikacaukan dihitung?
sumber
Kasus untuk kebingungan kode adalah ia menaikkan bilah untuk pihak ke-3 untuk menentukan apa / bagaimana kode itu bekerja.
Namun, itu TIDAK berarti bahwa seorang pengembang harus pernah menulis kode yang dikaburkan.
Lihat, ini adalah bagian yang menurut saya tidak ada dalam pertanyaan Anda: Kebingungan kode (seperti JavaScript minimal) tidak perlu - dan tidak boleh - dilakukan secara manual oleh pengembang. Demikian juga, ini tidak boleh disimpan sebagai file sumber inti Anda dalam kontrol versi.
Kebingungan kode harus terjadi sebagai langkah pemrosesan pasca selama kompilasi ke dalam produksi Anda. Ada banyak produk pihak ke-3 untuk melakukan ini juga, jadi hampir tidak ada alasan untuk melakukan ini di rumah.
Misalnya: Dotfuscator
IEEE memiliki makalah tentang efektivitas kebingungan kode
Tekankan milikku.
sumber
Saya telah berpartisipasi dalam pengembangan MMORPG. Ini melibatkan logika server dan logika klien. Sepanjang pengembangan proyek selama bertahun-tahun, setiap kali kami mempertimbangkan antarmuka antara klien dan server, aturannya adalah bahwa klien harus diperlakukan oleh server setiap saat dengan anggapan bahwa ia telah diretas. Dengan kata lain, server harus ditulis sedemikian rupa sehingga tidak ada respons yang dapat datang dari klien yang akan menyebabkan server gagal, atau memungkinkan klien untuk menipu. Namun, sudah diketahui sejak awal bahwa peretas akan menemukan lubang di sistem dan mengeksploitasi mereka untuk menipu. Dan setelah beberapa saat mereka melakukannya.
Tentu saja, sebelum mengirim klien ke dunia besar yang hebat di luar sana, kami memastikan untuk mengaburkannya. Kami percaya kebingungan memiliki efek berikut:
Akun game dari peretas yang ditemukan dihentikan tanpa pengembalian uang, jadi ini membuat bisnis peretasan lebih mahal dan kurang menarik.
Jadi, karena semua hal di atas, saya percaya kebingungan memiliki efek positif secara keseluruhan dalam permainan kami, dan dengan ekstensi, kebingungan dapat memiliki efek positif secara keseluruhan di setiap bagian dari perangkat lunak yang dapat diretas. (Misalnya, perangkat lunak yang berisi langkah-langkah perlindungan salinan.)
Efek yang memiliki kebingungan pada pemeliharaan hampir tidak ada. Ada beberapa tempat di mana beberapa programmer yang tidak berpengalaman membuat asumsi tentang nama-nama pengidentifikasi, (mereka menggunakan refleksi), tetapi begitu mereka dipilah semuanya baik-baik saja. Langkah kebingungan hanya menjadi bagian dari langkah build keseluruhan untuk versi produksi game, sehingga sebagian besar dari kita pengembang tidak pernah perlu khawatir tentang hal itu atau ada hubungannya dengan itu. Kami sudah memiliki alat untuk melihat log permainan, jadi kami memodifikasi alat untuk menggunakan tabel asosiasi (pemetaan pengidentifikasi yang dikaburkan menjadi pengidentifikasi yang tepat) yang diproduksi oleh obfuscator untuk menerjemahkan log untuk kami dengan cepat, jadi kami tidak pernah bahkan harus melihat pengidentifikasi yang dikaburkan saat melakukan pemeriksaan post-mortem berdasarkan log yang dikumpulkan dari lapangan.
sumber
Membaca dan memahami (dan jelas menulis) kode yang dikaburkan dapat menjadi tantangan mental yang menarik. Itu mungkin berada di luar ruang lingkup dari apa yang Anda tanyakan, tetapi contoh-contoh seperti IOCCC mungkin menjadi sumber hiburan sekaligus horor.
sumber