如何在c#中实现pbkdf2_sha256
How to implement pbkdf2_sha256 in 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 的内容。它们对密码散列有用吗?实际上,我不是解密我只是在软件中散列密码,然后将存储在服务器上的散列与软件中生成的散列进行比较
请帮帮我。
抱歉错误。
好吧,MSDN 中有一个完整的示例 here。
但是,如果您的目的真的是散列密码,我不建议您那样做。
无需解密您的密码。
如果只使用 SHA256 算法,会更简单、更安全。您需要做的就是将散列密码存储在您的数据库中,当有人尝试登录您的网站时,您将散列给定的密码并与存储在数据库中的值进行比较。
这样做你有一个单向加密,所以没有办法解密你的密码。
为什么?如果您的应用程序被黑客入侵,攻击者无法解密存储的密码,因此他们无法登录。
有一个关于如何使用 SHA256 进行散列的示例 here。真的,简单多了。
您在 Whosebug 其他地方找到的 Pbkdf2
class 不是 .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 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);
}
如果您需要在 .NET Framework 中使用 (HMAC-)SHA-1 以外的东西,您需要升级到 4.7.2。
API 文档:
我创建了一个网站,在登录时我使用 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 的内容。它们对密码散列有用吗?实际上,我不是解密我只是在软件中散列密码,然后将存储在服务器上的散列与软件中生成的散列进行比较
请帮帮我。 抱歉错误。
好吧,MSDN 中有一个完整的示例 here。
但是,如果您的目的真的是散列密码,我不建议您那样做。
无需解密您的密码。
如果只使用 SHA256 算法,会更简单、更安全。您需要做的就是将散列密码存储在您的数据库中,当有人尝试登录您的网站时,您将散列给定的密码并与存储在数据库中的值进行比较。
这样做你有一个单向加密,所以没有办法解密你的密码。
为什么?如果您的应用程序被黑客入侵,攻击者无法解密存储的密码,因此他们无法登录。
有一个关于如何使用 SHA256 进行散列的示例 here。真的,简单多了。
您在 Whosebug 其他地方找到的 Pbkdf2
class 不是 .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 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);
}
如果您需要在 .NET Framework 中使用 (HMAC-)SHA-1 以外的东西,您需要升级到 4.7.2。
API 文档: