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)));
}
encryption
pengguna1477388
sumber
sumber
SHA256
adalah fungsi hash kriptografis , bukan algoritma enkripsi. Ini adalah fungsi satu arah .Jawaban:
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
A
yang hash nilainyaB
, itu sangat, sangat sulit untuk secara sengaja menciptakan nilai lainC
yang juga hashB
.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 hanyalah0WrtCkg6IdaV/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.sumber
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).
sumber