Как реализовать pbkdf2_sha256 в C#
Я сделал сайт, на котором при входе в систему я использую pbkdf2_sha256 для хеширования пароля. Я также использовал соль. Я хочу сделать простое программное обеспечение только для удобства, я хочу войти в программное обеспечение C#, используя те же учетные данные, которые были сохранены на веб-сайте. Я видел Rfc2898DeriveBytes, я думаю, он принимает только 2 аргумента (пароль, соль в целом числе). Но как насчет итераций, которые я указал на сайте?
Кто-нибудь, пожалуйста, сообщите мне, как сделать вход в приложение C# (WPF) и использовать pbkdf2_sha256 для создания хэша и проверки пароля.
Я видел код, указанный на stacksoverflow.com.
var salt = "FbSnXHPo12gb";
var password = "geheim";
var interactions = 12000;
using (var hmac = new HMACSHA256())
{
var df = new Pbkdf2(hmac, password, salt, interactions);
Console.WriteLine(Convert.ToBase64String(df.GetBytes(32)));
}
Я использовал это также, но это дает ошибку в var df = new Pbkdf2(hmac, password, salt, interactions);
Pbkdf2 не удалось найти.
мой код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MySql.Data.MySqlClient;
using System.IO;
using System.Security.Cryptography;
namespace login
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void login_Click(object sender, RoutedEventArgs e)
{
var salt = "FbSnXHPo12gb";
var password = "geheim";
var interactions = 12000;
using (var hmac = new HMACSHA256())
{
var df = new Pbkdf2(hmac, password, salt, interactions);
Console.WriteLine(Convert.ToBase64String(df.GetBytes(32)));
}
string myConnection = "datasource=localhost;port=3306;username=root;password=abcde12345 ; database=finalproject";
MySqlConnection myConn = new MySqlConnection(myConnection);
MySqlCommand SelectCommand = new MySqlCommand("select * from login where Username='" + this.username.Text + "' and Password='" + this.password.Password + "';", myConn);
MySqlDataReader myReader;
myConn.Open();
myReader = SelectCommand.ExecuteReader();
int count = 0;
while (myReader.Read())
{
count = count + 1;
}
if (count == 1)
{
MessageBox.Show("Hello");
}
else
{
MessageBox.Show("Wrong username and password");
}
myConn.Close();
}
}
}
Поэтому, пожалуйста, скажите мне, какой алгоритм хеширования мне следует использовать на сервере, который подходит для пароля. Я читал о bcrypt и scyrpt. Они хороши для хеширования паролей? На самом деле, я не расшифровываю, я только хэширую пароль в программном обеспечении, а затем сравниваю хеш, хранящийся на сервере, с хэшем, сгенерированным в программном обеспечении.
Помогите мне, пожалуйста. Извините за ошибки.
2 ответа
Pbkdf2
класс, который вы нашли в другом месте в Stackru, не является частью.NET, поэтому для его использования вам нужно получить библиотеку, в которой он находится.
Чтобы сделать PBKDF2 с (HMAC-)SHA-2-256, вам потребуется как минимум.NET Core 2.0 или.NET Framework 4.7.2.
В любом случае вам нужно превратить свою соль в байты. Поскольку это кратное 4 символам, я предполагаю, что это base64:
byte[] saltBytes = Convert.FromBase64String(salt);
byte[] derived;
.NET Framework (2.0+) (HMAC-SHA-1):
using (var pbkdf2 = new Rfc2898DeriveBytes(password, saltBytes, interactionCount))
{
derived = pbkdf2.GetBytes(32);
}
.NET Core (2.0+),.NET Framework (4.7.2+) (с использованием HMAC-SHA-2-256):
using (var pbkdf2 = new Rfc2898DeriveBytes(
password,
saltBytes,
interactionCount,
HashAlgorithmName.SHA256))
{
derived = pbkdf2.GetBytes(32);
}
Если вам нужно использовать что-то отличное от (HMAC-)SHA-1 в.NET Framework, вам нужно обновить его до 4.7.2.
Документы API:
Ну, есть полностью рабочий пример здесь, в MSDN.
Но если ваша цель - хешировать пароль, я бы не советовал вам делать это так.
Нет необходимости расшифровывать ваши пароли.
Это намного проще и безопаснее, если вы просто используете алгоритм SHA256. Все, что вам нужно сделать, это сохранить хешированный пароль в вашей базе данных, и когда кто-то попытается войти на ваш сайт, вы хэшируете данный пароль и сравниваете его со значением, хранящимся в вашей базе данных.
При этом у вас есть одностороннее шифрование, поэтому нет способа расшифровать ваши пароли.
Зачем? Если ваше приложение было взломано, злоумышленники не смогут расшифровать сохраненные пароли и не смогут войти в систему.
Вот пример того, как хэшировать, используя SHA256 здесь. На самом деле, это намного проще.