ASP.NET 會員鹽?
ASP.NET 成員如何生成他們的 salt 密鑰,然後他們如何對其進行編碼(即是 salt + password 還是 password + salt)?
我在我的會員資格中使用SHA-1,但我想重新創建相同的鹽,以便內置會員資格的東西可以像我的東西一樣散列這些東西。
**編輯2:**沒關係。我誤讀了它,並認為它說的是字節,而不是位。所以我傳遞的是 128 字節,而不是 128 位。
**編輯:**我一直在努力做到這一點。這就是我所擁有的,
public string EncodePassword(string password, string salt) { byte[] bytes = Encoding.Unicode.GetBytes(password); byte[] src = Encoding.Unicode.GetBytes(salt); byte[] dst = new byte[src.Length + bytes.Length]; Buffer.BlockCopy(src, 0, dst, 0, src.Length); Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); byte[] inArray = algorithm.ComputeHash(dst); return Convert.ToBase64String(inArray); } private byte[] createSalt(byte[] saltSize) { byte[] saltBytes = saltSize; RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); rng.GetNonZeroBytes(saltBytes); return saltBytes; }所以我沒有嘗試查看 ASP.NET 成員是否會辨識這一點,但散列密碼看起來很接近。我只是不知道如何將其轉換為 base64 作為鹽。
我做了這個
byte[] storeSalt = createSalt(new byte[128]); string salt = Encoding.Unicode.GetString(storeSalt); string base64Salt = Convert.ToBase64String(storeSalt); int test = base64Salt.Length;測試長度為 172,遠遠超過 128 位,所以我做錯了什麼?
這就是他們的鹽的樣子
vkNj4EvbEPbk1HHW+K8y/A==這就是我的鹽的樣子
E9oEtqo0livLke9+csUkf2AOLzFsOvhkB/NocSQm33aySyNOphplx9yH2bgsHoEeR/aw/pMe4SkeDvNVfnemoB4PDNRUB9drFhzXOW5jypF9NQmBZaJDvJ+uK3mPXsWkEcxANn9mdRzYCEYCaVhgAZ5oQRnnT721mbFKpfc4kpI=
*ASP.NET 成員使用的預設雜湊算法是什麼?*對他們的預設算法有很好的討論。
我希望這會有所幫助!
編輯-我指的答案是頂帖中的程式碼,
public string EncodePassword(string pass, string salt) { byte[] bytes = Encoding.Unicode.GetBytes(pass); //byte[] src = Encoding.Unicode.GetBytes(salt); Corrected 5/15/2013 byte[] src = Convert.FromBase64String(salt); byte[] dst = new byte[src.Length + bytes.Length]; Buffer.BlockCopy(src, 0, dst, 0, src.Length); Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); byte[] inArray = algorithm.ComputeHash(dst); return Convert.ToBase64String(inArray); }他們正在使用 BlockCopy 結合 Unicode Salt + Pass
– 回答你的問題:
這兩種算法都是必要的,並且扮演著不同的角色……
RNG Crypto 用於生成鹽。它基本上是一長串隨機數據。這是基於每個使用者生成和儲存的。通常這是在創建使用者或更改密碼時完成的。
BlockCopy 只是他們用來將鹽與密碼結合起來的方法。上面的程式碼本質上等同於鹽+密碼。
您將無法重新創建鹽值,因為它是完全隨機的。但是,它由框架為每個使用者儲存。
將鹽與密碼結合起來,並使用上述技術對其進行雜湊處理,將允許您使用框架儲存的雜湊值驗證使用者密碼。
我認為我們都以不同的方式閱讀您的問題。我發布的程式碼不會生成您的 salt,但它會讓您以與 ASP.NET 成員資格兼容的方式使用它。
抱歉,我的解釋不是最好的——這能回答你的問題嗎?