我正在尝试制作一个从1位到3位长的字典,其中包含a,b,c,d,... 7,8,9; aa,bb,cc,dd,...,77,88,99& aaa,bbb,... 888,999 MD5哈希函数并将其存储在SQL中。我尝试使用3作为嵌套循环来填充我的sql列-palintext和MD5哈希列 - 我对C#很新,这就是我测试的;我对这段代码有严重的问题。正确的表格应该如何,我该如何编辑呢?
我试过了:
private void button1_Click(object sender, EventArgs e)
{
var list = "abcdefghijklmnopqrstuvwxyz0123456789".ToString();
for ( int i = 0 ; i < list.Length ; i++ )
{
com.Connection = con;
com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash) values(@PlainText,@MD5Hash)";
com.Parameters.AddWithValue("@PlainText", List);
com.Parameters.AddWithValue("@MD5Hash", md[List]);
MessageBox.Show(com.ExecuteNonQuery().ToString());
for (int j = 0; j < list.Length; j++)
{
com.Connection = con;
com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash) values(@PlainText,@MD5Hash)";
com.Parameters.AddWithValue("@PlainText", List);
com.Parameters.AddWithValue("@MD5Hash", md[List]);
MessageBox.Show(com.ExecuteNonQuery().ToString());
for (int k = 0; k < list.Length; k++)
{
com.Connection = con;
com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash) values(@PlainText,@MD5Hash)";
com.Parameters.AddWithValue("@PlainText", List);
com.Parameters.AddWithValue("@MD5Hash", md[List]);
MessageBox.Show(com.ExecuteNonQuery().ToString());
}
}
}
}
public string md(string input)
{
MD5 md5 = MD5.Create();
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
string sb;
sb = "";
for (int i = 0; i < hash.Length; i++)
{
sb += hash[i].ToString("X2");
}
return sb;
}
}
}
答案 0 :(得分:0)
此代码甚至无法编译。
什么是(var[]List)
?您的意思是list
吗?
此声明:var[] list = "abcdefghijklmnopqrstuvwxyz0123456789".ToString();
应为var list = "abcdefghijklmnopqrstuvwxyz0123456789".ToString();
此声明com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash)
没有结束双引号或分号。
答案 1 :(得分:0)
建造彩虹桌,是吗?
您需要了解问题分解的概念。将问题分解成更小,更简单的部分使事情变得更加简单。
首先,您需要一种方法将数据插入彩虹表:
static void InsertIntoDb( string key , string value )
{
string connectString = "your-connect-string-here" ;
Func<string,string> qt = s => s.Replace("'" , "''") ;
using( SqlConnection sql = new SqlConnection(connectString) )
using ( SqlCommand cmd = sql.CreateCommand() )
{
cmd.CommandText = string.Format( @"insert dbo.RainbowTable( md5 , text ) values ( '{0}' , '{1}' )" , qt(key) , qt(value) ) ;
cmd.CommandType = CommandType.Text;
sql.Open();
cmd.ExecuteNonQuery() ;
sql.Close() ;
}
return ;
}
然后你需要一个方法来计算一段文本的MD5哈希并返回一个包含其十六进制表示的字符串:
static string ComputeMd5Hash( string s , Encoding e )
{
MD5 md5 = MD5.Create() ;
byte[] octets = e.GetBytes(s) ;
byte[] hash = md5.ComputeHash(octets) ;
string hex = "0x" + hash.Aggregate( new StringBuilder("0x") , (sb,x) => sb.Append(x) ).ToString() ;
return hex ;
}
最后,你需要一个方法来生成你需要的字符串(**提示: recursion 的概念在这里可能很有用。)
static IEnumerable<string> GetStringsToBeHashed()
{
// your string generation code here
}
这些作品中的每一件都只做一件事,易于构建且易于测试。
一旦你掌握了所有的部件,那就很容易把它们放在一起了:
foreach ( string s in GetStringsToBeHashed() )
{
string hash = ComputeMd5Hash(s,Encoding.UTF8) ;
InsertIntoDb( hash, s ) ;
}