Enkripsi Tidak Dapat Dibalik?

9

Saya mendapat kesan bahwa string terenkripsi tidak dapat didekripsi sehingga nilai asli hilang selamanya.

Namun, jika string berikut selalu sama dengan "dominic" (nama saya), maka tidak dapatkah ada cara logis untuk membalikkannya; menjadi seperti itu tidak acak juga bukan berdasarkan tanggal / waktu, tetapi ada metode logis untuk itu?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

Tidak peduli apa atau berapa kali saya mengenkripsi "dominic" (string), selalu sama dengan di atas. Jadi, bukankah seharusnya ada cara untuk mendekripsi string seperti itu?

Contoh dari apa yang saya bicarakan:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}
pengguna1477388
sumber
3
Apakah Anda berbicara tentang hash kriptografi suatu nama (sering digunakan dalam kata sandi)? atau enkripsi (yang dimaksudkan untuk didekripsi oleh orang yang berwenang)?
11
SHA256adalah fungsi hash kriptografis , bukan algoritma enkripsi. Ini adalah fungsi satu arah .
1
Penafian wajib: beri garam hash ( en.wikipedia.org/wiki/Salt_(cryptography) ). Selain itu SHA256 cenderung terlalu cepat untuk tidak memiliki masalah dengan serangan brute-force menggunakan GPU misalnya. Disarankan untuk menggunakan sesuatu seperti PBKDF2 atau scrypt.
Maciej Piechotka
7
Hashing seperti penggiling daging. Anda dapat mengubah sapi menjadi daging sapi giling, tetapi tidak sebaliknya.
Neil McGuigan
1
Apakah Anda bingung dengan enkripsi kunci publik / pribadi? Jika orang lain mengenkripsi pesan dengan kunci publik Anda, dia tidak bisa mendekripsi pesan itu sendiri. Hanya Anda yang dapat mendekripsi ini - dan mungkin NSA, Mossad, FSB, dan Tiroler Geheimdienst.
ott--

Jawaban:

39

Enkripsi selalu dapat dibalik. Inti enkripsi adalah mengambil pesan dan menyandikannya dengan kunci rahasia sehingga hanya orang lain yang memiliki kunci yang dapat membalikkan enkripsi dan membaca pesan tersebut.

Apa yang Anda lihat di sini adalah hashing , yang tidak sama dengan enkripsi, meskipun teknik kriptografi sering digunakan dalam mengimplementasikan hash. Gagasan hash adalah bahwa ia menggunakan teknik matematika yang rumit untuk membangun nilai baru yang memetakan ke nilai lama, yang dapat diulang. Tidak ada kunci, dan itu tidak dimaksudkan untuk dibalik. Hash kriptografis yang kuat dibuat dengan properti matematika yang, jika Anda memiliki nilai Ayang hash nilainya B, itu sangat, sangat sulit untuk secara sengaja menciptakan nilai lain Cyang juga hash B.

Hash tidak perlu bersifat reversibel, karena digunakan untuk otentikasi. Jika Anda memberi saya nama pengguna dan kata sandi, Anda benar-benar tidak ingin saya menyimpan kata sandi itu di basis data saya, karena jika seseorang meretas dan mendapatkan akses ke basis data saya, mereka bisa mendapatkan kata sandi Anda! Jadi sebagai gantinya, saya akan menyimpan hash kata sandi Anda di database. Kemudian ketika Anda masuk, saya memeriksa untuk melihat apakah ada nama pengguna yang cocok dengan Anda, dengan entri kata sandi yang cocok dengan hash kata sandi yang Anda kirim, dan jika demikian Anda diautentikasi, karena sangat sulit untuk membuat benturan hash ( dua nilai yang hash ke nilai yang sama) dengan hash yang baik, jadi saya hampir yakin bahwa kata sandi yang Anda gunakan adalah yang benar.

Properti lain dari hash kriptografi yang kuat adalah sangat sulit untuk dibalik. Anda tahu bahwa nilainya 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=adalah hash untuk "dominic" karena Anda baru saja menyelesaikannya, tetapi jika Anda tidak tahu itu, dan tidak tahu harus mulai dari mana, dan yang Anda miliki hanyalah 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=, itu benar-benar dapat membawa Anda miliaran bertahun-tahun untuk mengetahui bahwa aslinya adalah "dominan", jika hash adalah yang baik. Sekali lagi, ini berguna untuk mencegah kerusakan jaminan jika daftar kata sandi dicuri.

Mason Wheeler
sumber
2
Tidak bisakah saya mengambil daftar kata-kata yang diketahui dan mengulanginya sampai saya menemukan kecocokan hash? Apakah ini sebabnya situs web menyarankan untuk menambahkan huruf besar dan angka ke kata sandi Anda agar lebih aman?
user1477388
15
@ user1477388: Ya, itulah sebabnya situs web menyarankan itu. Itu adalah cara yang terkenal untuk menyerang kata sandi hash: itu disebut "serangan kamus," karena alasan yang jelas, dan menggunakan kata-kata yang tidak ada dalam kamus adalah langkah penting untuk mengamankannya ..
Mason Wheeler
1
Terlihat seperti ini memiliki beberapa wawasan yang baik untuk saya "ketidakmampuan untuk percaya bahwa ini tidak dapat dikembalikan entah bagaimana" security.stackexchange.com/questions/11717/... Bukannya aku ingin / memiliki kebutuhan untuk membalikkan mereka; Saya hanya penasaran.
user1477388
3
Saran lain adalah menambahkan sesuatu yang unik untuk setiap kata sandi sebelum di-hash. Perbedaan kata sandi satu karakter membuat hash yang sama sekali berbeda, gagasan bahwa semua hasil hash Anda akan menjadi unik. Kalau tidak, jika seorang hacker menemukan hash untuk kata "password123", maka mereka akan tahu menggunakannya untuk SEMUA nama pengguna dengan hash tertentu. Sepertinya Anda memiliki kepala yang bagus untuk hal semacam ini, semoga beruntung.
Katana314
1
@MasonWheeler: menggunakan kata-kata yang tidak ada dalam kamus tidak benar-benar diperlukan, terutama mengingat bagaimana "kamus" yang digunakan dalam serangan biasa tidak seperti kamus Oxford, melainkan daftar string yang dikenal sering digunakan dalam kata sandi . Daripada mencoba menghindari kata-kata ini, lebih baik untuk memilih, mengatakan, 5 kata acak dari daftar 2000 atau lebih kata-kata: frasa sandi seperti itu, bahkan jika kamus 2000 kata diketahui, membutuhkan waktu hampir 100 kali lebih lama untuk brute- memaksa dari 8 karakter acak dari 64.
tdammers
9

Apa yang Anda lakukan bukanlah "enkripsi", per se; itu "hashing". Perbedaan utama antara kedua adalah bahwa enkripsi adalah mudah reversibel (dengan kunci yang benar tentu saja), sedangkan hashing dirancang untuk menjadi sangat sulit untuk membalikkan dalam keadaan lain daripada mengetahui pesan asli di tempat pertama.

Secara teori, hash mensimulasikan "oracle acak", sebuah homunculus hipotetis dengan memori eidetik dan cara menghasilkan angka unik yang unik dan acak tanpa batas rentang atas. Anda akan memberi pria kecil ini pesan, dan satu dari dua hal akan terjadi; entah dia belum pernah melihat pesan sebelumnya, dalam hal ini dia menghasilkan nomor acak baru dan memberikannya kepada Anda sebagai intisari, atau dia telah melihat pesan itu sebelumnya, dan dia mengingat dan memberikan nomor yang dia hasilkan ketika dia melihatnya pertama kali. Dalam model teoritis itu, tidak ada hubungan nol antara pesan dan intisari pesannya, dan tanpa nomor tunggal yang muncul dua kali dari RNG tidak ada kemungkinan tabrakan.

Sayangnya, kami tidak memiliki ramalan acak yang ideal; ide ini memiliki ketidakmungkinan praktis untuk implementasi digital, seperti kemampuan oracle untuk secara efisien menyimpan dan mengingat setiap pesan yang pernah diacak oleh siapa pun di mana pun, dan kemampuan klien untuk menerima angka yang bisa ratusan atau ribuan digit desimal panjangnya. Sebagai gantinya, kami memiliki fungsi hash, yang merupakan operasi matematis ireversibel (satu arah) yang bekerja pada pesan itu sendiri, untuk membuat transformasi deterministik (pesan yang sama => hash yang sama) tanpa jelashubungan antara hash dan pesan asli. Seperti disebutkan dalam komentar, seharusnya juga tidak ada perubahan yang dapat diprediksi ke nilai hash yang dihasilkan dengan membuat perubahan sistematis pada pesan; idealnya, setiap bit intisari akan memiliki peluang 50% untuk berubah, memberikan perubahan pada sedikit pun pesan.

Ada banyak kegunaan untuk fungsi hash; mereka digunakan untuk verifikasi tantangan (anggap kredensial masuk seperti kata sandi) tanpa perlu bagi kedua pihak untuk mengetahui rahasia teks biasa, dan mereka digunakan sebagai checksum untuk memverifikasi bahwa pesan belum dirusak atau rusak. Mereka juga digunakan dalam apa yang disebut skenario "bukti kerja"; tugas komputasi yang sulit untuk diselesaikan tetapi mudah diverifikasi.

Jika Anda pernah menemukan cara untuk secara efisien membalikkan hash digest SHA256 untuk menghasilkan pesan (pesan apa saja) yang akan menghasilkan hash itu, itu akan menjadi bukti dengan demonstrasi bahwa sebenarnya hash rusak secara fundamental. Faktanya, SHA256 diyakini aman, artinya tidak ada metode yang terdokumentasi, betapapun praktisnya, untuk memulai dengan hash digest dan menghasilkan pesan bertabrakan yang membutuhkan lebih sedikit pekerjaan daripada sekadar mencoba setiap kemungkinan (yang untuk SHA-256 idealnya 2 ^ 256 ~ = 10 ^ 77 kemungkinan).

KeithS
sumber
Mungkin perlu disebutkan juga bahwa dalam fungsi hash yang ideal, perubahan satu bit pada input harus menghasilkan perubahan 50% dari bit output. Ini disebut efek longsoran salju .
CVn
2
@ MichaelKjörling: Secara tepat, seseorang harus mengharapkan setiap bit berubah dengan probabilitas 50%, yang berbeda dari (tetapi menyiratkan) mengharapkan 50% dari bit berubah, rata-rata.
Dietrich Epp
@DietrichEpp Memang, dan artikel Wikipedia yang saya tautkan membuatnya jelas, tetapi lebih mudah bagi pengguna akhir untuk menghitung jumlah bit yang diubah antara dua input.
CVn