2011-11-24 199 views
0

我想创建一个基本的WPF应用程序,它可以在SQL Server 2008中存储加密的密码,并且在用户尝试登录时也检索回密码,但我收到错误下面这篇文章'插入SQL Server 2008时'字符串或二进制数据被截断'

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

我读通彩虹攻击和盐和散列后..

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

我的错误得到的是

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

我读这篇文章,并试图将textbox.text转换为字符串,并试图在密码输入texbox只有一个字母,但仍然不工作(“我改变了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); 
    } 

THKS的帮助!

+0

另外,就像注意 - 如果你使用单向密码,没有任何奇怪的方式来解码它们,所以你已经失败了。即使修复了世界上所有的错误,也不会让你检索到密码。使用SHA很容易就可以获得诺贝尔数学的价格。 – TomTom

+0

我敢打赌我的秘密SHA256.unhash(),它是引发此错误的密码列,Base64每2个输入字节使用3个字符。 –

+0

认为OP想要检索散列密码并将其与散列用户输入进行比较,而不是从数据库的散列值中获取原始密码。 –

回答

3

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

要标识触发此错误的列,您可以逐个删除参数(删除该列的da.InsertCommand.Parameters.Add行,并在INSERT语句的VALUES部分中放入一个常量,如'John')来更改INSERT语句。

编辑#1:

继续消除列一个接一个(就像你一样,密码栏),一旦插入语句不失败,你会知道什么样的列造成的错误。然后调试以找出您分配的值的长度(失败)列参数。数据库中该列的长度必须大于值的长度您试图插入。

另一件需要注意的事情:在写你的问题的时候,你认为密码列是问题,但也许其他一些列是问题。 只有解决此错误的方法是使所有列足够宽,以便可以将值存储在其中

编辑#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字符串的长度。数据库表中的密码列必须等于或大于此长度。

+0

确定基本上根据你说的话改变了下面的句子da.InsertCommand = new SqlCommand(“INSERT INTO Member_info(Name,Username,Password,Email,Member)VALUES(@ Name,@ Username,'jhon',@ Email, @Member)“,cs);并注释掉了//da.InsertCommand.Parameters.Add(“@Password”,SqlDbType.VarChar).Value; = HashPassword(Password_tb.ToString());你想说什么? – JackyBoi

+0

你说得对,我的陈述在回答中是不完整的,我会马上添加它。 –

+0

嗨,我嗨,我遵循了你的建议,并将所有的列改为普通值..但是当我这样做没有问题..当我扭转回来我的意思是把@密码回我得到一个错误..问题是我如你所见,在WPF中创建这条线它已经是一个密码输入..所以没有'password.text'这样的东西..那么该怎么办? – JackyBoi

0

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

我想创建一个可以在SQL SERVER 2008存储加密的密码,也找回取回密码基本的WPF应用程序,当用户尝试的登录,但我收到后 错误关注此文章http://www.dreamincode.net/forums/topic/123865-one-way- 加密/

失败,已解雇。请参阅 - 单向哈希(不加密)被称为是因为它是一种方式。没有办法在没有打破它的情况下检索密码。程序将无法工作。

也试图在密码输入texbox只有一个字母,但仍然不列入工作

阅读文档如何腌制的作品。 SHA将输入转换为特定长度的二进制随机数。无论您是否提供1或1000个字符长的密码都是完全不相关的,结果将始终是固定的二进制代码。

return Convert.ToBase64String(arrbyte);

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

无论如何,写出你在这里返回的字符串的长度。根据表结构长度查找所有参数。成品。

而且你仍然没有完成作业 - SHA不能不中断地取回。

可以在SQL Server 2008中存储加密口令,也 检索回当用户尝试的登录

永远不会使用这种方法来实现密码

基本WPF应用程序。

+0

哇!那非常详细,tks DONAL TRUMP!哈哈,我被解雇了!所以,任何文章,我可以阅读并通过您的详细报告阅读后得到正确的解决方案..我希望你有..casue我beatup找到一个! – JackyBoi

+0

当然。阅读有关加密选项的信息 - 并远离所谓的“单向”合成,而不是说当你需要两种方式时这意味着什么。 – TomTom

+3

@TomTom,OP想要检索散列密码并将其与散列用户输入进行比较,而不是将数据库中的散列值转换回原始的纯文本密码。 –

相关问题