Asp.net

ASP.NET 會員鹽?

  • August 12, 2009

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 成員資格兼容的方式使用它。

抱歉,我的解釋不是最好的——這能回答你的問題嗎?

引用自:https://stackoverflow.com/questions/1267882