Как реализовать 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 здесь. На самом деле, это намного проще.

Другие вопросы по тегам