【问题标题】:Hashing password algorithm and actual running of the program哈希密码算法和程序的实际运行
【发布时间】:2012-05-18 02:13:42
【问题描述】:

我是 C# 编程的新手,我尝试使用 C# 和 MySQL 数据库在 WPF 中创建登录表单。当我运行我的 WPF 并尝试插入数据时,我在这一行收到错误:

using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username"))
{
    cmd.Parameters.AddWithValue("@username", username);
    salt = cmd.ExecuteScalar() as string;
}

错误是连接必须有效且打开。你知道问题出在哪里吗?

伙计们,这是我只是用虚幻替换敏感数据字段的整个代码,虽然我改变了一些东西,但我仍然得到错误。你能确定问题出在哪里吗?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Security.Cryptography;
using System.Security.Authentication;
using System.Security.Permissions;
using System.Security.AccessControl;
using System.Security.Policy;
using System.Security.Principal;
using System.Security.Util;




namespace ECBSRecruitmentAgencySoftware
{
    public partial class LogIn : Form
    {

        public LogIn()
        {

            InitializeComponent();

        }

    static byte[] GenerateSaltedHash(string plainText, string salt)
    {
       HashAlgorithm algorithm = new SHA256Managed();

       byte[] plainTextBytes = System.Text.Encoding.Unicode.GetBytes(plainText);
       byte[] saltBytes = Convert.FromBase64String(salt);

       byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];
       saltBytes.CopyTo(plainTextWithSaltBytes, 0);
       plainTextBytes.CopyTo(plainTextWithSaltBytes, salt.Length); 

       byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);

       return hash;
    }

        public bool tryLogin(string username , string password)
        {
             using (var con = new MySqlConnection("host=tara.rdb.superhosting.bg;user=sozopouk;password=27051996;database=sozopouk_test2;"))
             {
                 con.Open();

                 var salt = string.Empty;

                 using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username"))
                 {
                     cmd.Parameters.AddWithValue("@username", username);

                     salt = cmd.ExecuteScalar() as string;
                 }

                 if (string.IsNullOrEmpty(salt)) return false;

                 var hashedPassword = GenerateSaltedHash(password, salt);

                 using (var cmd = new MySqlCommand("Select * FROM niki WHERE user_name = @username and user_password = @password"))
                 {
                    cmd.Parameters.AddWithValue("@username", username);
                    cmd.Parameters.AddWithValue("@password", hashedPassword);

                    using (var reader = cmd.ExecuteReader())
                    {
                         return reader.Read();
                    }
                 }
             }
        }

        private void button1_Click(object sender, EventArgs e)
        {
             if (tryLogin(user.Text, pass.Text) == true)
            {
                MainScreen F2 = new MainScreen();
                F2.Show();
                this.Hide();
            }

             else MessageBox.Show("Wrong details!");

        }        
        }


}

你的意思是我必须更新:

 using (var con = new MySqlConnection("host=tara.rdb.superhosting.bg;user=sozopouk;password=27051996;database=sozopouk_test2;"))
                 {
                     con.Open();

                     var salt = string.Empty;

                     using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username"))
                     {
                         cmd.Parameters.AddWithValue("@username", username);

                         salt = cmd.ExecuteScalar() as string;
                     }
enter code here
enter code here

使用您生成的代码?如果是,我实际上如何连接到我的 MySQL 数据库?

【问题讨论】:

  • 您需要将连接添加到您的 sql 命令对象。 .......“文本”,con);

标签: c# mysql


【解决方案1】:

好吧,在尝试读取或写入数据库之前,您应该打开一个连接,然后发出命令。

using (MySqlConnection cn = GetConnection())
{
    cn.Open();
    // create the command and link it to the connection
    using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username", cn)) 
    { 
        cmd.Parameters.AddWithValue("@username", username); 
        salt = cmd.ExecuteScalar() as string; 
    }
} 

public MySqlConnection GetConnection()
{
     MySqlConnection cn = new MySqlConnection("Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;");
     return cn;
}

编辑:拼图的缺失部分在这里:

MySqlCommand cmd = MySqlCommand("your_query_text", cn)

【讨论】:

  • 如果你仔细看我的回答,你会发现,在创建命令时,我添加了连接。因此,当命令执行时,它知道要使用的连接。在您的示例中,此关联从未完成,因此出现错误。
【解决方案2】:

这里有几个问题。

第一个是您似乎没有实际实例化 MySqlConnection 对象,这是建立连接所必需的。

看:http://zetcode.com/db/mysqlcsharptutorial/

有关如何在 C# 中使用 MySql 的一些信息

【讨论】:

    【解决方案3】:

    你有联系吗?尝试类似

            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                connection.Open();
                using (MySqlCommand command = new MySqlCommand("Select salt From niki where user_name = @username", connection))
                {
                    command.CommandType = CommandType.Text;
                    command.Parameters.AddWithValue("@username", username);
                    salt = cmd.ExecuteScalar() as string;
                }                
            }
    

    编辑你更新的帖子你没有使用连接,你需要在 MySqlCommand 的构造函数中

    using (MySqlCommand command = new MySqlCommand(Command, Connection))
    {
    }
    

    或者其他类似的东西

    command.Connection = connection;
    

    Edit 2如果你用下面的代码替换你的数据库代码你还有问题吗?

                 using (var con = new MySqlConnection("host=tara.rdb.superhosting.bg;user=sozopouk;password=27051996;database=sozopouk_test2;"))
                 {
                     con.Open();
    
                     var salt = string.Empty;
    
                     using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username", con))
                     {
                         cmd.Parameters.AddWithValue("@username", username);
    
                         salt = cmd.ExecuteScalar() as string;
                     }
    
                     if (string.IsNullOrEmpty(salt)) return false;
    
                     var hashedPassword = GenerateSaltedHash(password, salt);
    
                     using (var cmd = new MySqlCommand("Select * FROM niki WHERE user_name = @username and user_password = @password", con))
                     {
                        cmd.Parameters.AddWithValue("@username", username);
                        cmd.Parameters.AddWithValue("@password", hashedPassword);
    
                        using (var reader = cmd.ExecuteReader())
                        {
                             return reader.Read();
                        }
                     }
                 }
    

    【讨论】:

    • @NikolayDyankov 更新了我的答案
    • 我仍然收到错误:'field list' 中的未知列'salt' 行:'salt = cmd.ExecuteScalar() as string;'
    • sql语句有效吗? niki 表是否包含名为 salt 的列?对于像salt = (string)cmd.ExecuteScalar()这样的执行标量,强制转换也更好
    猜你喜欢
    • 2011-10-10
    • 2020-09-16
    • 2012-05-24
    • 2021-02-09
    • 2012-02-19
    • 2012-06-03
    • 1970-01-01
    • 2017-03-01
    • 2020-04-27
    相关资源
    最近更新 更多