Saya bertanya-tanya apakah Password Hasher yang default diimplementasikan dalam UserManager yang dilengkapi dengan MVC 5 dan ASP.NET Identity Framework, apakah cukup aman? Dan jika demikian, apakah Anda bisa menjelaskan kepada saya cara kerjanya?
Antarmuka IPasswordHasher terlihat seperti ini:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Seperti yang Anda lihat, ini tidak memerlukan banyak garam, tetapi disebutkan di utas ini: " Asp.net Identity password hashing " yang benar-benar membuat garam di belakang layar. Jadi saya bertanya-tanya bagaimana cara melakukannya? Dan dari mana asalnya garam ini?
Kekhawatiran saya adalah garam itu statis, membuatnya tidak aman.
securiry.stackexchange.com
. Dan terima kasih atas tipnya!Jawaban:
Berikut adalah cara implementasi default ( ASP.NET Framework atau ASP.NET Core ) bekerja. Ini menggunakan Fungsi Derivasi Kunci dengan garam acak untuk menghasilkan hash. Garam dimasukkan sebagai bagian dari output KDF. Jadi, setiap kali Anda "hash" kata sandi yang sama Anda akan mendapatkan hash yang berbeda. Untuk memverifikasi hash, output dibagi kembali ke garam dan sisanya, dan KDF dijalankan lagi pada kata sandi dengan garam yang ditentukan. Jika hasilnya cocok dengan sisa output awal hash diverifikasi.
Hashing:
Memverifikasi:
sumber
HashPassword
fungsinya, mengembalikan keduanya dalam string yang sama? Dan ketika Anda memverifikasinya, ia membaginya lagi dan mem-hash password cleartext yang masuk, dengan garam dari split, dan membandingkannya dengan hash asli?var hashedPassword = HashPassword(password); var result = VerifyHashedPassword(hashedPassword, password);
- adalah apa yang perlu Anda lakukan. setelah ituresult
berisi true.Karena hari ini ASP.NET adalah open source, Anda dapat menemukannya di GitHub: AspNet.Identity 3.0 dan AspNet.Identity 2.0 .
Dari komentar:
sumber
Saya mengerti jawaban yang diterima, dan telah memilihnya tetapi saya pikir saya akan membuang jawaban orang awam saya di sini ...
Membuat hash
Memeriksa kata sandi terhadap hash
Untuk memeriksa kata sandi yang dimasukkan pengguna.
Hash
Di bawah penutup hash dihasilkan menggunakan fungsi hash SHA1 ( https://en.wikipedia.org/wiki/SHA-1 ). Fungsi ini disebut berulang 1000 kali (Dalam implementasi Identity default)
Mengapa ini aman?
sumber
Bagi mereka seperti saya yang baru dengan ini, berikut adalah kode dengan const dan cara aktual untuk membandingkan byte []. Saya mendapatkan semua kode ini dari stackoverflow tetapi mendefinisikan konstanta sehingga nilainya dapat diubah dan juga
Di dalam ApplicationUserManager kustom Anda, Anda mengatur properti PasswordHasher nama kelas yang berisi kode di atas.
sumber
_passwordHashBytes = bytes.GetBytes(SaltByteSize);
Saya kira Anda maksudkan ini_passwordHashBytes = bytes.GetBytes(HashByteSize);
.. Tidak masalah dalam skenario Anda karena keduanya berukuran sama tetapi secara umum ..