我正在尝试创建一个基本的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);
}
寻求帮助!
答案 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中存储加密的密码 当用户尝试登录
时,检索密码
。