我需要將一羣用戶帳戶Moodle導入到用c#編寫的系統中。尋找c#相當於php的密碼驗證()
Moodle使用password_hash()函數創建密碼散列。我需要能夠在c#中驗證這些密碼。
換句話說,我正在尋找PHP的密碼驗證函數( http://www.php.net/manual/en/function.password-verify.php)的c#實現。
我GOOGLE了一下,但不能真正找到任何接近,所以我要求避免重新發明輪子:-)
感謝的希望!
我需要將一羣用戶帳戶Moodle導入到用c#編寫的系統中。尋找c#相當於php的密碼驗證()
Moodle使用password_hash()函數創建密碼散列。我需要能夠在c#中驗證這些密碼。
換句話說,我正在尋找PHP的密碼驗證函數( http://www.php.net/manual/en/function.password-verify.php)的c#實現。
我GOOGLE了一下,但不能真正找到任何接近,所以我要求避免重新發明輪子:-)
感謝的希望!
Got it!
首先通過NuGet包安裝CryptSharp。 (使用2.0「官方」軟件包),順便說一句,BCrypt.net不適合我。
然後:
using CryptSharp;
bool matches = Crypter.CheckPassword("password goes here", "hash goes here");
注意,哈希應該是這樣開始: 「$ 2Y $ ...」
就像一個魅力! :-)
那麼我知道你不想爲它編寫代碼,.Net有一個內置的密碼庫,用於計算哈希並加密它。 您必須通過導入Security.Cryptography來使用它。您可以將結果與保存在數據庫中的結果進行比較。這是代碼。
class Program
{
static int SaltValueSize = 8;
static void Main(string[] args)
{
string pass = "Password";
string result = ComputeHash(pass, new MD5CryptoServiceProvider());
Console.WriteLine("Original: " + pass + "\nEncrypted: " + result);
Console.WriteLine("Is user valid: " + IsUserValid("UserName", pass));
Console.WriteLine("With Salt, Original: " + pass + "\nEcrypted: " + System.Text.Encoding.Default.GetString(ComputePasswordHash(pass, salted)));
Console.ReadLine();
}
private static byte[] ComputePasswordHash(string password, int salt)
{
byte[] saltBytes = new byte[4];
saltBytes[0] = (byte)(salt >> 24);
saltBytes[1] = (byte)(salt >> 16);
saltBytes[2] = (byte)(salt >> 8);
saltBytes[3] = (byte)(salt);
byte[] passwordBytes = UTF8Encoding.UTF8.GetBytes(password);
byte[] preHashed = new byte[saltBytes.Length + passwordBytes.Length];
System.Buffer.BlockCopy(passwordBytes, 0, preHashed, 0, passwordBytes.Length);
System.Buffer.BlockCopy(saltBytes, 0, preHashed, passwordBytes.Length, saltBytes.Length);
SHA1 sha1 = SHA1.Create();
return sha1.ComputeHash(preHashed);
}
public static string ComputeHash(string input, HashAlgorithm algorithm)
{
Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
return BitConverter.ToString(hashedBytes);
}
public static bool IsUserValid(string userName, string password)
{
bool isValid;
string result = VerifyPassword(password);
// isValid = Your database call in a form of Inverted statement which you
//can check if the user with the hashed password exists or Not
return isValid;
}
public static string VerifyPassword(string password)
{
return ComputeHash(password, new MD5CryptoServiceProvider());
}
}
嗨艾哈邁德!感謝您的幫助,但您的解決方案將無法正常工作。 「$ 2y $」表示MD5CryptoServiceProvider無法處理的基於Blowfish的哈希。 – Filip
這是很糟糕的密碼哈希。你忘了鹽,MD5太快了。 – CodesInChaos
這只是一個簡單的方法,Filip沒有說任何關於鹽的東西,我只是向他展示.Net有一個內置的庫。 –
您可以提供一個鏈接,以便了解這個有用的.NET BCrypt實現嗎? –
http://www.zer7.com/software/cryptsharp是我用過的。通過NuGet Package Manager安裝也很容易。 – Filip
男人,我真的希望這會爲我做的伎倆。我正在嘗試這個,我總是得到錯誤的回報。做了一些搜索,發現你的文章如此想知道爲什麼它不工作。已經以「$ 2y $」開頭。我將NuGet的2.1.0版本拉下來。我錯過了什麼? – ToddB