当前位置:  开发笔记 > 后端 > 正文

维护消息完整性

如何解决《维护消息完整性》经验,为你挑选了1个好方法。

我有一条消息说我要传递给自己,这将受到中间人攻击.因此,我担心在发送消息之前保持消息的完整性以及我收到消息的时间.

应该假设,一旦我将消息发送给自己,将来我将无法获得有关所发送消息的信息.该消息完全是自包含的.

为此,我知道应该在发送消息之前对消息内容进行散列并比较散列,并且在发送消息之后,如果它们不同,则消息已被篡改.

当然,如果中间人知道散列实际上只是消息内容的散列,那么因为消息是自包含的,他只能创建新内容并应用相同的散列算法的内容.

问题是,在生成哈希时,我应该在多大程度上随机化消息内容?什么时候到达收益递减点?

在这种情况下,我有一组键/值对.为此,我知道我必须采取的步骤是:

    在邮件中添加salt.盐是世界其他地方的秘密.它在散列之前附加到消息的内容.

    在生成哈希之前以一致的方式对键/值对进行排序.

    虽然不直接相关,但是在散列之前会将时间戳添加到每条消息的内容中,以防止重放攻击.

这些是我正在考虑的可选步骤:

    在我订购之前转换密钥.我考虑过逆转它们,然后按计数/键排序.

    使用分隔键/值对的分隔符(包括键/值的分隔符和对的分隔符).

注意

此处不需要邮件隐私,因此我不寻求加密.值必须以纯文本形式传输.

最后,我应该避免哪些哈希算法?


细节

我有一个ASP.NET MVC站点,我有一个处理输入验证和持久性的控制器.

如果(基于启发式,并不重要)输入被确定为自动垃圾邮件尝试,IDictionary则使用输入值创建模型,并将ViewResult发送到通用CAPTCHA页面.

在该视图中,在包含CAPTCHA控件的表单中,IDictionary将在隐藏的输入字段中写出内容,并且表单的操作将与内容最初发布到的操作相同.这样,MVC可以在重新提交表单时获取值.

这是因为我无法加密键/值对(或者我可以而且应该,告诉我为什么以及如何!).

当然,我需要再添加一个值,其中包含散列消息内容.如果该值存在,则控制器将检查是否保持了消息完整性,并允许输入持久存储.

我选择使用System.Security.Cyrptography.Pkcs命名空间中的SignedCms类,该命名空间表示CMS/PKCS#7消息的链接和验证.

为了详细说明,我已经使用MAKECERT.EXE创建了一个自行颁发的证书,然后在我的代码中,我使用此处的示例对数据进行数字签名:

http://blogs.msdn.com/shawnfa/archive/2006/02/27/539990.aspx

现在,应该保持导出的私钥上的密码安全,以及服务器上的安全性,这使得它更少编程.

我将不得不为重放攻击的时间戳添加额外的密钥,但这不会太难.

答案取决于Kalium,不是因为他的初始帖子,而是他的后续评论指出了数字签名的方式,并最终发现了如何在.NET中使用它们.

感谢所有贡献的人.



1> Kalium..:

我认为PGP/GPG就是你想要的.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有