插入SQL Server 2008时“截断字符串或​​二进制数据”

时间:2011-11-24 15:58:11

标签: c# sql-server-2008 passwords

我正在尝试创建一个基本的WPF应用程序,该应用程序可以在SQL Server 2008中存储加密的密码,并在用户尝试登录时检索回密码,但是在关注本文后出现错误

http://www.dreamincode.net/forums/topic/123865-one-way-encryption/

我通过彩虹攻击,腌制和散列来阅读..

我尝试了一些代码,但收到了错误

我得到的错误是

  

字符串或二进制数据将被截断

我读过这篇文章,并试图将textbox.text转换为字符串,并尝试在密码短信集中只键入一个字母但仍然不起作用(“为了安全起见,我更改了connstring,因为connstring正在运行,并且有没问题“)

private void button1_Click(object sender, RoutedEventArgs e)
{
        string strPassword;
        SqlConnection cs= new SqlConnection("Data Source=STEVEJOBS;Initial Catalog=Test database;Integrated Security=True");
        SqlDataAdapter da = new SqlDataAdapter();
        da.InsertCommand = new SqlCommand("INSERT INTO Member_info(Name,Username,Password,Email,Member) VALUES(@Name,@Username,@Password,@Email,@Member)", cs);
        da.InsertCommand.Parameters.Add("@Name", SqlDbType.NVarChar).Value = Name_tb.Text;
        da.InsertCommand.Parameters.Add("@Email", SqlDbType.VarChar).Value = Email_tb.Text;
        da.InsertCommand.Parameters.Add("@Username", SqlDbType.VarChar).Value = Username_tb.Text;

        //MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
        //byte[] hashedBytes;
        //UTF8Encoding encoder = new UTF8Encoding();
        //hashedBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPassword));
        //SqlParameter paramPwd;
        //paramPwd = new SqlParameter("@Password", SqlDbType.Binary, 16);
        //paramPwd.Value = hashedBytes;
        //da.InsertCommand.Parameters.Add(paramPwd);

        da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = HashPassword(Password_tb.Text.ToString());
        da.InsertCommand.Parameters.Add("@Member", SqlDbType.NText).Value =Myes_rb.Content ;

        cs.Open();

        da.InsertCommand.ExecuteNonQuery();

        cs.Close();
        MessageBox.Show("Sucessfully added");
    }

    static string HashPassword(string pasword)
{
           byte[] arrbyte = new byte[pasword.Length];
           SHA256 hash = new SHA256CryptoServiceProvider();
           arrbyte = hash.ComputeHash(Encoding.UTF8.GetBytes(pasword));
           return Convert.ToBase64String(arrbyte);
    }

寻求帮助!

2 个答案:

答案 0 :(得分:3)

当您尝试插入字符数多于列定义中指定的字符串时,会出现此错误。使您的字符串列更宽。

要识别触发此错误的列,可以通过逐个删除参数来更改INSERT语句(删除该列的da.InsertCommand.Parameters.Add行,并在INSERT语句的VALUES部分中添加一个常量,如' John& #39;)

编辑#1:

继续逐个删除列(就像你使用密码列一样)并且一旦insert语句没有失败,你就会知道哪个列导致了错误。然后调试以找出您分配给(失败)列参数的值的长度。数据库中该列的长度必须>> =您尝试插入的值的长度。

另外需要注意的是:在撰写问题时,您认为密码列存在问题,但也许其他一些列存在问题。 此错误的唯一解决方案是使所有列足够宽,以便将值存储在其中

编辑#2:

使用Password属性来输入文本用户:

    da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = 
        HashPassword(Password_tb.Password);

要获取散列密码的长度,请改用此代码:

    string pwdHash = HashPassword(Password_tb.Password);
    da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = pwdHash;

在第二行放置断点并检查pwdHash字符串的长度。数据库表中的密码列必须等于或大于此长度。

答案 1 :(得分:0)

好的,你完全没了。你有很多问题。让我们开始:

  

我正在尝试创建一个可以在SQL中存储加密密码的基本WPF应用程序   SERVER 2008并在用户尝试登录时检索密码但我得到了密码   关注本文后出现错误http://www.dreamincode.net/forums/topic/123865-one-way-   加密/

失败,被解雇了。请参阅, - 单向散列(非加密)是因为它是单向的。没有办法在没有破坏的情况下重新发现密码。程序永远不会奏效。

  

还尝试在密码texbox中只键入一个字母但仍然无法正常工作

阅读文档如何进行腌制。 SHA将输入转换为特定长度的二进制数字。无论你输入1或1000个字符长的密码都是完全无关紧要的,结果总是一个固定的长度二进制代码。

  

返回Convert.ToBase64String(arrbyte);

这是非常不正常的。大多数人会将数组转换为HEX(固定长度,易于读/写以进行调试)并使用它。

无论如何,写出你在这里返回的字符串的LENGTH。检查您为表结构长度输入的所有参数。结束。

你仍然没有完成作业 - SHA在没有破坏的情况下无法恢复。

  

基本的WPF应用程序,可以在SQL SERVER 2008中存储加密的密码   当用户尝试登录

时,检索密码
用这种方法永远不会实现