如何从DataTable对象创建校验和?
问题描述:
我有一个45-50列和45-50行的数据表,我想创建一个校验文本或md5,sha1,我不知道哪一个更好。如果还有一个,我将创建该文本并在数据库中进行搜索。但文字长度必须在100-200字之间,我不知道我能否做到。那么你对此有何看法,我该怎么做?如何从DataTable对象创建校验和?
谢谢。
答
首先你应该做你的数据集
http://www.eggheadcafe.com/community/aspnet/2/7700/serializedeserialize-a-datatable.aspx
的二进制序列化计算SHA1:
/// <summary>
/// Calculates SHA1 hash
/// </summary>
/// <param name="text">input string</param>
/// <param name="enc">Character encoding</param>
/// <returns>SHA1 hash</returns>
public static string CalculateSHA1(string text, Encoding enc)
{
byte[] buffer = enc.GetBytes(text);
SHA1CryptoServiceProvider cryptoTransformSHA1 =
new SHA1CryptoServiceProvider();
string hash = BitConverter.ToString(
cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
return hash;
}
或MD5:
http://www.spiration.co.uk/post/1203/MD5%20in%20C%23%20-%20works%20like%20php%20md5%28%29%20example
答
以下应做到:
// Serialize the table
var serializer = new DataContractSerializer(typeof(DataTable));
var memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, table);
byte[] serializedData = memoryStream.ToArray();
// Calculte the serialized data's hash value
var SHA = new SHA1CryptoServiceProvider();
byte[] hash = SHA.ComputeHash(serializedData);
// Convert the hash to a base 64 string
string hashAsText = Convert.ToBase64String(hash);
请注意,我们序列化整个表,不仅是其字段值与该表必须有一个名称,以便允许系列化
为什么这么长的校验? SHA1只有160位,结果是20个字符。哈希碰撞可以通过2^80(1,208,925,819,614,629,174,706,176)次尝试中的蛮力方法来实现,并且在大约2^69次尝试中通过有针对性的攻击来实现。更多信息可以在Schneier的博客上找到:http://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html – 2011-01-26 15:07:01
100-200个字符是最重要的。如果我能用20个字符处理它没问题。但我不想从数据表对象创建校验和,也想检查行和字段。那么我可以找到是否有另一个。 – mehmetserif 2011-01-26 15:19:40