it-swarm-id.com

Bagaimana menentukan jenis pengkodean / enkripsi apa yang telah digunakan?

Apakah ada cara untuk menemukan jenis enkripsi/pengkodean apa yang digunakan? Sebagai contoh, saya menguji aplikasi web yang menyimpan kata sandi dalam database dalam format terenkripsi (WeJcFMQ/8+8QJ/w0hHh+0g==). Bagaimana cara menentukan hashing atau enkripsi apa yang digunakan?

156
Karthik

String contoh Anda (WeJcFMQ/8+8QJ/w0hHh+0g==) adalah pengkodean Base64 untuk urutan 16 byte, yang tidak terlihat bermakna ASCII atau UTF-8. Jika ini adalah nilai yang disimpan untuk kata sandi - verifikasi (yaitu tidak benar-benar kata sandi "terenkripsi", bukan kata sandi "hash") maka ini mungkin merupakan hasil dari fungsi hash yang dihitung atas kata sandi; fungsi hash klasik dengan output 128-bit adalah MD5, tetapi bisa tentang apa saja.

Cara "normal" untuk mengetahui hal itu adalah dengan melihat kode aplikasi. Kode aplikasi berinkarnasi dengan cara yang nyata dan gemuk (file yang dapat dieksekusi pada server, kode sumber di suatu tempat ...) yang tidak, dan tidak dapat, sebanyak yang dilindungi oleh kunci rahasia. Jadi reverse engineering adalah "cara untuk pergi".

Kecuali rekayasa terbalik, Anda dapat membuat beberapa percobaan untuk mencoba membuat tebakan yang berpendidikan:

  • Jika pengguna yang sama "mengubah" kata sandinya tetapi menggunakan kembali yang sama, apakah nilai yang disimpan berubah? Jika ya, maka sebagian dari nilai mungkin adalah "garam" atau IV acak (dengan asumsi enkripsi simetris).
  • Dengan asumsi bahwa nilainya adalah deterministik dari kata sandi untuk pengguna tertentu, jika dua pengguna memilih kata sandi yang sama, apakah itu menghasilkan nilai yang tersimpan yang sama? Jika tidak, maka nama pengguna mungkin merupakan bagian dari perhitungan. Anda mungkin ingin mencoba menghitung MD5 ("nama pengguna: kata sandi") atau varian serupa lainnya, untuk melihat apakah Anda mendapatkan kecocokan.
  • Apakah panjang kata sandi terbatas? Yaitu, jika Anda menetapkan kata sandi 40 karakter dan tidak dapat berhasil mengotentikasi dengan mengetik hanya 39 karakter pertama, maka ini berarti bahwa semua karakter penting, dan ini menyiratkan bahwa ini adalah kata sandi hashing, not - enkripsi (nilai yang disimpan digunakan untuk memverifikasi kata sandi, tetapi kata sandi tidak dapat dipulihkan dari nilai yang disimpan saja).
140
Thomas Pornin

Sunting: Saya baru saja melihat skrip yang sangat keren bernama hashID . Nama itu cukup banyak menggambarkannya.

~~~

Secara umum, menggunakan pengalaman untuk membuat dugaan yang terpelajar adalah bagaimana hal-hal ini dilakukan.

Berikut adalah daftar dengan jumlah hash output yang sangat besar sehingga Anda tahu bagaimana masing-masing terlihat dan membuat tanda tangan/patters atau hanya memverifikasi secara optik.

Ada dua hal utama yang pertama kali Anda perhatikan:

  • panjang hash (setiap fungsi hash memiliki panjang keluaran spesifik)
  • alfabet yang digunakan (semua huruf bahasa Inggris? angka 0-9 dan A-F jadi hex? karakter khusus apa yang ada jika ada?)

Beberapa program peretas kata sandi (John the ripper misalnya) menerapkan beberapa pencocokan pola pada input untuk menebak algoritma yang digunakan, tetapi ini hanya bekerja pada hash umum. Misalnya, jika Anda mengambil keluaran hash dan memutar setiap huruf dengan 1, sebagian besar skema pencocokan pola akan gagal.

68
john

Yang telah Anda poskan adalah 16 byte (128 bit) dari data dasar yang disandikan 64. Fakta bahwa basis 64 dikodekan tidak memberi tahu kita banyak karena basis 64 bukan algoritma enkripsi/hashing itu adalah cara untuk menyandikan data biner ke dalam teks. Ini berarti bahwa blok ini mencakup satu informasi yang berguna, yaitu bahwa outputnya panjangnya 16 byte. Kita dapat membandingkan ini dengan ukuran blok skema yang biasa digunakan dan mencari tahu apa yang tidak bisa dilakukan. Sejauh ini skema yang paling umum adalah:

Hal berikutnya yang perlu kita lakukan adalah melihat blok teks sandi yang lain untuk mengetahui jawaban atas pertanyaan berikut:

  • Apakah semua teks sandi memiliki panjang yang sama, bahkan untuk panjang input yang berbeda?

Jika tidak semua blok memiliki panjang yang sama maka Anda tidak melihat algoritma hashing, tetapi enkripsi. Karena output akan selalu berupa kelipatan dari ukuran blok yang mendasarinya, keberadaan blok yang tidak dapat habis dibagi 16 byte akan berarti bahwa itu tidak bisa menjadi AES dan karenanya harus DES atau 3DES.

Jika Anda memiliki kemampuan untuk memasukkan kata sandi dan mengamati hasilnya, ini dapat ditentukan dengan sangat cepat. Cukup masukkan kata sandi 17 karakter dan lihat panjangnya. Jika 16 byte Anda memiliki MD5, 20 byte berarti SHA-1, 24 byte berarti DES atau 3DES, 32 byte berarti AES.

26
Yaur

Jika ini memang hash kata sandi sederhana, kami mungkin dapat menggunakan Google untuk memecahkannya . Base64 sulit untuk dicari, dengan semua garis miring dan tanda tambah, jadi mari kita konversi hash menjadi heksadesimal:

$ Perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

OK, sekarang kita bisa Google untuk it . Saat ini, saya mendapatkan hanya satu hit , dari md5this.com - walaupun jelas akan ada lebih banyak, termasuk posting ini.

Sayangnya (atau mungkin untungnya, tergantung pada perspektif Anda), kami tidak cukup beruntung untuk benar-benar menemukan preimage (situs saat ini daftar hash ini sebagai "cracking ..."), tetapi kenyataan bahwa itu ada di daftar itu sama sekali tidak sangat menyarankan bahwa itu memang hash MD5 asli dari kata sandi asli.

6
Ilmari Karonen

Itu tergantung pada format - beberapa protokol untuk menyimpan teks terenkripsi memiliki bagian teks yang menentukan bagaimana itu dienkripsi. Dari contoh Anda, saya ragu karena string yang Anda rujuk sangat pendek sehingga sepertinya itu hanya teks yang dienkripsi.

Saya menyarankan beberapa pemikiran:

  • "==" di bagian akhir pasti akan menjadi padding, jadi jangan masukkan itu dalam upaya dekripsi apa pun.

  • Anda mungkin berurusan dengan hash atau hash asin, daripada enkripsi. Jika demikian, mencoba "mendekripsi" data tidak akan berfungsi - Anda harus mencocokkan kata sandi dengan menggunakan nilai hash dan/atau garam yang sama dengan yang digunakan pada awalnya. Tidak ada kata sandi asin untuk mendapatkan nilai asli.

  • Taruhan terbaik Anda adalah mendapatkan salinan kode yang digunakan untuk menyimpan kata sandi. Di suatu tempat di sana, kata sandi sedang menjalani operasi kriptografi. Temukan kode untuk mempelajari apa yang terjadi di sini. 9 kali dari 10, mereka menggunakan semacam API untuk hashing/salting/enkripsi dan Anda dapat meniru atau membalikkannya menggunakan API yang sama.

6
bethlakshmi

Pengkodean umumnya dapat ditebak. Sebagai contoh, string yang Anda posting di pertanyaan Anda disandikan Base64. Tanda sama dengan padding dalam skema Base64. Itu sesuatu yang saya tahu dari pengalaman.

Jika Anda memberi saya string yang dienkripsi, saya mungkin dapat memberi tahu Anda penyandiannya tetapi saya tidak dapat memberi tahu Anda algoritma yang digunakan untuk mengenkripsi itu kecuali ada semacam metadata yang tersedia. Alasannya adalah ini: algoritma enkripsi bekerja dengan menghasilkan apa yang tampak sebagai data acak. Jika saya mengenkripsi dua kalimat masing-masing dengan dua cipher (empat output), Anda tidak akan dapat memberi tahu saya dengan keyakinan apa saja ciphertext milik cipher itu kecuali Anda mendekripsi atau memecahkan cipher.

Sehubungan dengan instance spesifik Anda, kata sandi biasanya di-hash. Itu berarti Anda tidak dapat memulihkan kata sandi dari hash, tetapi Anda dapat menguji untuk melihat apakah hash cocok dengan kata sandi. Dalam hal itu, @john's answer berwarna emas. Jika Anda dapat memasukkan kata sandi yang Anda ketahui dan kemudian mencoba skema umum untuk menentangnya, Anda dapat mempelajari apa yang digunakan hash.

6
Jeff Ferland

Satu-satunya cara adalah menebak. Dengan pengalaman, tebak bekerja akan lebih benar.

Sebagai contoh: Berdasarkan panjang output: output MD5 adalah 128 bit, atau 16 byte, output SHA1 adalah 160 bit, atau 20 byte. Berdasarkan pada charset output: BASE64 menghasilkan output dengan karakter yang dapat dicetak.

Pada akhirnya, itu adalah pendekatan coba-dan-kesalahan yang mengajarkan Anda bagaimana.

4
Nam Nguyen

Ini adalah keamanan yang sangat lemah di semua lini! Plaintext adalah P4 $$ w0rdP4 $$ w0rd dan dienkripsi menggunakan XOR enkripsi, dengan kunci CdZ4MLMPgYtAE9gQ80gMtg ==. Ini menghasilkan ciphertext diposting oleh OP di atas, WeJcFMQ/8 + 8QJ/w0hHh + 0g ==.

Untuk memverifikasi:

Pertama, gunakan xxd untuk mendapatkan biner dari plaintext:

echo -n 'P4$$w0rdP4$$w0rd' | xxd -b -c16

Ini menghasilkan:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100

Selanjutnya, base64-decode kunci dan gunakan xxd untuk mendapatkan biner kunci:

echo -n 'CdZ4MLMPgYtAE9gQ80gMtg==' | base64 -d | xxd -b -c16

Ini menghasilkan:

00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110

Sekarang, XOR dua string biner:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  (plaintext)
[XOR]
00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  (key)
-----------------------------------------------------------------------------------------------------------------------------------------------
01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010  (ciphertext)

Akhirnya, gunakan bc, xxd, dan base64 untuk mengubah cipherteks biner menjadi base64:

echo "obase=16; ibase=2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010" | bc | xxd -p -r | base64

Ini menghasilkan WeJcFMQ/8 + 8QJ/w0hHh + 0g ==, yang merupakan ciphertext yang diposting oleh OP dalam pertanyaan di atas.


Saya minta maaf jika jawaban ini sepertinya dibuat-buat. Memang benar. Pertanyaan yang mirip dengan ini, di mana poster hanya menyediakan beberapa ciphertext, dan meminta beberapa wawasan tentang bagaimana ciphertext itu dapat diproduksi, tampaknya cukup sering muncul di security.stackexchange.com; dan pertanyaan ini sering dirujuk sebagai duplikat untuk itu. Inti dari jawaban ini adalah untuk menggambarkan bahwa pertanyaan seperti ini tidak dapat dijawab, karena ada solusi tak terbatas untuk jenis pertanyaan ini.

1
mti2935

Satu-satunya cara adalah ketika ada beberapa metadata yang memberi tahu Anda. Sebagai contoh, saya telah bekerja dengan PDF belakangan ini, dan formatnya mencakup kamus yang berisi filter, algoritme, ukuran kunci, dll. Tetapi jika yang Anda miliki hanyalah ciphertext, maka yang Anda miliki hanyalah beberapa gumpalan buram dari data.

1
user185