我建立了一个系统,让两个系统相互通信。 系统A在数据库中放入消息M,系统B处理消息并在数据库中放入消息M'。 系统A“订阅”到M'。 要“签名”此消息(一个大的xml文件)我使用哈希码,所以我可以理解消息M'= M. 这适用于大多数消息但是其他消息不能正常工作(我在记事本中打开了两个文件M和M'并且它们是相同的。)
可能是系统B格式(当然没有更改内容)消息,导致返回的方式不同的哈希码。
听起来合理吗? 如何以更健壮的方式签署消息?
到目前为止,我正在使用C#,.NET3.5来实现这一目标,而且我无法改变技术。
我正在以这种方式从fs中读取M(并生成哈希码):
_currentHashCode = File.ReadAllText(file.FullName).GetHashCode();
在B中的所有处理之后,B已经通知我,它将M'发送给对象:
object messageObj;
....
int hash = messageObj.ToString().GetHashCode();
由于
答案 0 :(得分:2)
GetHashCode()
不会返回加密哈希值。您需要使用System.Security.Cryptography空间中的一种机制以您希望的方式创建哈希。
哈希代码用于在基于哈希表的集合中进行有效插入和查找。哈希码不是 永久价值。出于这个原因:
- 不要序列化哈希码值或将它们存储在数据库中。
- 请勿使用哈希码作为密钥从密钥集合中检索对象。
- 不要跨应用程序域或进程发送哈希码。在某些情况下,可以在每个进程上计算哈希码 每个应用程序域的基础。
- 如果您需要加密强大,请不要使用哈希码而不是加密哈希函数返回的值 哈希值。对于加密哈希,请使用从中派生的类 System.Security.Cryptography.HashAlgorithm或 System.Security.Cryptography.KeyedHashAlgorithm类。
- 不测试哈希码的相等性以确定两个对象是否相等。 (不等的对象可以具有相同的哈希码。)To 测试相等性,调用ReferenceEquals或Equals方法。