如何在c#

时间:2017-09-05 18:49:01

标签: hash salt .net pbkdf2

我创建了一个网站,在登录时我使用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 个答案:

答案 0 :(得分:2)

您在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 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文档:

答案 1 :(得分:0)

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

但是,如果您的目的确实是哈希密码,我建议您不要这样做。

无需解密您的密码。

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

执行此操作您有单向加密,因此无法解密您的密码。

为什么呢?如果您的应用程序遭到黑客攻击,攻击者无法解密存储的密码,因此无法登录。

有一个关于如何使用SHA256 here进行哈希的示例。真的,它更容易。