【问题标题】:How to implement pbkdf2_sha256 in c#如何在 C# 中实现 pbkdf2_sha256
【发布时间】:2018-02-14 19:24:39
【问题描述】:

我创建了一个网站,在登录时我使用 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 的文章。它们适合密码哈希吗?实际上,我不是在解密,我只是在软件中对密码进行哈希处理,然后将存储在服务器上的哈希值与软件中生成的哈希值进行比较

请帮助我。 有错误请见谅。

【问题讨论】:

  • 也许我弄错了,但“Pbkdf2”不都是小写的吗?可能意味着它没有找到它的原因。
  • 您引用的特别 PBKDF2 实现仅在 .NET Core 中可用,在完整的 .NET 框架中不可用。要在框架中使用 PBKDF2,您需要寻找 System.Security.Cryptography.Rfc2898DeriveBytes。它确实有一个 ctor 重载,允许您指定迭代次数。
  • Xander 是对的。 Rfc2898DeriveBytes 是你想要的类。要么,要么搜索实现Argon2 绑定的 NuGet 包,因为 Argon2 是当前最先进的。
  • 其实我不是在解密,我只是在软件中对密码进行哈希处理,然后将存储在服务器上的哈希值与软件中生成的哈希值进行比较。
  • System.Security.Cryptography.Rfc2898DeriveBytes 这是一个命名空间,我用过这个,但错误还是一样。

标签: hash salt .net pbkdf2


【解决方案1】:

您在 StackOverflow 其他地方找到的 Pbkdf2 类不是 .NET 的一部分,因此要使用它,您需要获取它所在的库。

要使用 (HMAC-)SHA-2-256 执行 PBKDF2,您至少需要 .NET Core 2.0 或 .NET Framework 4.7.2。

无论哪种方式,您都需要将盐转换为字节。因为它是 4 个字符的倍数,所以我假设它是 base64:

byte[] saltBytes = Convert.FromBase64String(salt);
byte[] derived;

.NET 框架 (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);
}

如果您需要在 .NET Framework 中使用 (HMAC-)SHA-1 以外的其他内容,则需要升级到 4.7.2。

API 文档:

【讨论】:

  • 我正在使用像“fQ6x8I******”这样的盐。我从你的帖子中得到了一个想法,你能告诉我要添加哪些引用以使代码正常工作吗?如果您可以键入一个小程序来生成 pbkdf2_sha256 用于演示的哈希,这对我真的很有帮助。我是新来的。 @@@@ 谢谢回复,真的很有帮助@@@@
  • 我尝试了您提供的代码我收到错误错误错误 CS1729 'Rfc2898DeriveBytes' 不包含采用 4 个参数的构造函数
  • 您需要使用 .NET Core 2.0 并针对 netcoreapp20 TFM 进行编译才能使用新的 4 参数构造函数。
  • 对不起,我是新手............ .Net Core 2.0 是 NuGet 包吗? ......以及对netcoreapp20进行编译意味着什么?...好的,.net core 2.0是一个.net版本,对吗?...谢谢您的回复
  • 我安装了 .Net core 2.0 .......但在菜单中没有显示任何选项,我可以在其中更改我的 .NET 框架版本(我的项目的属性)。它可用于 WPF 应用程序吗?如果它是那么何使用它。我有更少的时间来完成它请帮忙。 @@@@@@@@@@谢谢@@@
【解决方案2】:

嗯,MSDN 中有一个完整的示例 here。

但是,如果您的目的真的是散列密码,我不建议您这样做。

无需解密您的密码。

如果您只使用 SHA256 算法,它会更容易和更安全。您需要做的就是将散列密码存储在您的数据库中,当有人尝试登录您的网站时,您将对给定密码进行散列处理并与存储在数据库中的值进行比较。

这样做你有一个单向加密,所以没有办法解密你的密码。

为什么?如果您的应用程序被黑客入侵,攻击者将无法解密存储的密码,因此他们无法登录。

有一个关于如何使用 SHA256 here 进行散列的示例。真的,这要容易得多。

【讨论】:

  • PBKDF2 确实会产生散列。 SHA256 太快了,不适合散列密码。
  • 所以请告诉我我应该在服务器上使用哪种散列算法对密码有用。我读过关于 bcrypt 和 scyrpt 的文章。它们适合密码哈希吗?
  • 实际上,我的散列是 pbkdf2_sha256 的组合,我猜它是一种算法。
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 2019-01-07
  • 2021-01-14
  • 2021-08-18
  • 2010-09-28
  • 2016-04-13
  • 2014-10-29
  • 2011-01-17
相关资源
最近更新 更多