我有消息(m),在以不安全的方式发送数据后,我想存储一些数据来验证其完整性。
我可以创建一个数字签名(DSA / RSA)。
或者我可以计算一个摘要(散列)并对其进行加密。
在任何情况下,当接收方收到消息时,都应该验证其完整性。
什么方法更安全的S(m)或C( H(m) )?
更新
假设爱丽丝想给鲍勃发个口信
使用数字签名:
爱丽丝的角色:
鲍勃的角色:
使用摘要:
爱丽丝的角色:
鲍勃的角色:
我看到了使用我发布的第二种方法的软件,但我认为第一种方法更安全,对吗?
更新2
总之,最好的方法是使用第一种方法,使用一种安全的方式与Bob共享Alice的公钥。
第二种方法根本不提供安全性。
感谢@Perseids
发布于 2014-07-29 16:57:18
它们都不管用。
第一个攻击:夏娃在攻击中间安装一个人,并拦截由发送的所有消息。她没有转发m,而是转发n。她没有在m上使用爱丽丝的私钥签名,而是用她的私钥在n上转发一个签名。她寄给鲍勃的不是爱丽丝的公钥,而是她的公钥。鲍勃永远也看不出这种区别,因为他事先不知道爱丽丝的公钥。
攻击第二个:拦截所有来自的消息(并将它们丢弃),并创建与‘相同的消息,但使用n而不是m。别忘了假装是爱丽丝。
问题的根源在于鲍勃需要对爱丽丝的真实身份有一定的了解。如果你不知道比他的名字更“比尔盖茨”,那么我很容易冒充他。数字签名的标准假设是Bob从安全源了解Alice的公钥,或者他们以前通过安全通道进行交换。然后鲍勃可以检查爱丽丝的签名和已知的爱丽斯的好公钥。
发布于 2014-07-29 16:34:49
在数字签名的上下文中,“消息”通常是一个散列值--即某个文档的摘要(通常意义上的“消息”)。因此,当您以适当的方式“签署文档”时,您正在将由签名算法定义的单向转换应用于该文档的摘要,而不是整个文档。
当然,您可以发明基于对称或非对称加密的消息身份验证的其他方法,或者同时基于这两种方法。但这样,你肯定会重新发明轮子,而且你的车轮很有可能变成四倍左右。数字签名算法是专门为公钥基础设施中的无缝身份验证而设计的。所以要适当地使用它们。
https://stackoverflow.com/questions/25018871
复制相似问题