我有消息(m),并且我希望在以不安全的方式发送它之后存储一些数据以验证其完整性。
我可以创建数字签名(DSA / RSA)。
或者我可以计算摘要(哈希)并加密它。
在任何情况下,当接收者获得消息时,应验证其完整性。
什么方法更安全S(m)或C(H(m))?
更新
假设Alice想要向Bob发送消息
使用数字签名:
爱丽丝的一部分:
Bob的一部分:
使用摘要:
爱丽丝的一部分:
Bob的一部分:
我看到一个软件使用我发布的第二种方法,但我认为第一种方法更安全,我是对的吗?
更新2
总之,最好的方法是使用第一种方法,使用安全的方式与Bob共享Alice的公钥。
第二种方法根本不提供安全性。
感谢@Perseids
答案 0 :(得分:4)
它们都不起作用。
攻击第一个: Eve在中间攻击中安装一名男子并拦截Alice发送的所有邮件。而不是转发m
她转发n
。而不是m
上的签名与Alice'私钥她使用私钥在n
上转发签名。而不是爱丽丝'公钥给她发送她的公钥。 Bob永远不会看到差异,因为他事先并不知道Alice公钥。
对第二个攻击:拦截来自Alice的所有邮件(并将其丢弃)并创建与Alice'相同的邮件。没过,n
代替m
。不要忘记假装是爱丽丝。
问题的根源在于Bob需要了解 Alice才是真正的理解。如果你不了解比尔盖茨"比起他的名字,我很容易冒充他。数字签名的标准假设是Bob知道Alice'来自安全源的公钥或之前通过安全通道交换的公钥。那么Bob可以检查Alice'签名反对 - 已知是好的 - 爱丽丝的公钥。
答案 1 :(得分:0)
在数字签名的上下文中,“消息”通常是散列值 - 这是某些文档的摘要(常规意义上的“消息”)。因此,当您以适当的方式“签署文档”时,您将通过签名算法定义的单向转换应用于该文档的摘要 - 而不是整个文档。
当然,您可以基于对称或非对称加密技术,或者同时在两者上发明一些其他的消息身份验证方法。但是因此你肯定会重新发明轮子,并且很有可能你的轮子会变成四倍左右。数字签名算法专为公钥基础设施内的无缝身份验证而设计。所以要适当地使用它们。