2015-11-18 30 views
0

背景ASP.NET身份 - 驗證密碼,不需要框架

我現在用的是

Microsoft.AspNet.Identity; 

框架的MVC的網站。我在網站中實現了所有標準功能,如密碼檢索,電子郵件確認等。

我的問題

我想創建一個非常基本的應用程序在Xamarin C#,但我希望它用,我成立了自己的網站數據庫,以及 - 當然 - 包括驗證密碼。

通過我的想法應該去是這樣的:在手機

  1. 用戶輸入登錄信息。
  2. 電話散列密碼並使用WCF服務,它將散列字符串作爲輸入
  3. 返回bool。取決於哈希驗證。

我不能在我的Xamarin應用程序中使用

Microsoft.AspNet.Identity; 

問題

如何重新創建Asp.Identity使用這樣我就可以驗證密碼的哈希?

如果情況是我必須使用原始密碼(這是安全的嗎?)來使用WCF並對服務本身執行散列操作 - 我是否可以使用Identity框架?如果沒有,那麼我仍然有創建/驗證散列的問題。

另外,如果我跟我的這些散列函數的理解大錯特錯請隨時來教育我:)

額外的資訊

我已經嘗試了哈希函數給出完全不同的散列到的身份框架 - 在我的測試中,我發現使用完全相同的密碼創建用戶會給出不同的哈希值。 (由於鹽用嗎?)

回答

0

好吧,我已經找到了解決辦法

發佈爲人民着想,有類似問題

通過zespri參考this答案。 Upvoted的方式

我已決定使用原始密碼和用戶名使用WCF,並簡單地使用該函數來驗證上述答案。

編輯

只是爲了澄清它的代碼(從上面的鏈接獲取)這一點,我用它來驗證密碼:

public static bool VerifyHashedPassword(string hashedPassword, string password) 
{ 
byte[] buffer4; 
if (hashedPassword == null) 
{ 
    return false; 
} 
if (password == null) 
{ 
    throw new ArgumentNullException("password"); 
} 
byte[] src = Convert.FromBase64String(hashedPassword); 
if ((src.Length != 0x31) || (src[0] != 0)) 
{ 
    return false; 
} 
byte[] dst = new byte[0x10]; 
Buffer.BlockCopy(src, 1, dst, 0, 0x10); 
byte[] buffer3 = new byte[0x20]; 
Buffer.BlockCopy(src, 0x11, buffer3, 0, 0x20); 
using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, dst, 0x3e8)) 
{ 
    buffer4 = bytes.GetBytes(0x20); 
} 
return ByteArraysEqual(buffer3, buffer4); 
}