使用计数器代替盐进行散列

时间:2013-11-27 13:59:44

标签: security hash cryptography salt one-time-password

我正在开发自己的协议以进行安全的消息交换。 每条消息都包含以下字段:HMAC,时间,盐和消息本身。使用已知密钥在所有其他字段上计算HMAC。

协议应该防止回复攻击。在较长的时间间隔"时间"记录防止重放攻击(双方应该有同步时钟)。但是为了防止短时间间隔内的重放攻击(时钟不太准确),我计划更换" salt"每次发送新消息时,计数器字段都会增加。接收方将丢弃计数器值小于或等于前一个消息计数器的消息。

我做错了什么?

初始计数器值可以不同(我可以使用参与方标识符作为初始值),但攻击者将知道它(以未加密形式传输的参与方标识符)。 (https://security.stackexchange.com/questions/8246/what-is-a-good-enough-salt-for-a-saltedhash

但攻击者可以为计数器+ 1,计数器+ 2,计数器+ 3预先计算彩虹表...如果我不使用真正的随机盐?

1 个答案:

答案 0 :(得分:0)

我不确定你的设计和要求,所以其中一些可能不合适;希望其中一些也很有用。

首先,我在理解攻击方面遇到了一些麻烦;我可能只是遗漏了一些东西。 Alice向Bob发送消息,该消息包括计数器,有效载荷和(counter || payload)的HMAC。 Eve拦截并重播消息。鲍勃见过那一个,所以他扔掉了。 Eve尝试计算一个带有计数器+ 1的新消息,但是她无法计算此消息的HMAC(因为计数器不同),所以Bob将其抛弃。只要有秘密可用,Eve就永远不能伪造消息,重播消息不会做任何事情。

那么“已知密钥是什么?”这个密钥是否为攻击者所知? (如果是的话,那么他可以轻易伪造消息,所以HMAC没有帮助。)既然你注意到你有DH,你是否用它来协商一个密钥?

假设我错过了攻击,请仔细考虑其余问题:如果您有共享密码,为什么不使用它来加密邮件,或者至少是时间+计数器?通过加密时间和计数器,彩虹表应该是不切实际的。

如果存在某些共享密钥,但您没有可用于加密的处理器,您仍然可以执行类似MD5(机密+计数器)的操作以防止攻击者提前猜测(您必须已为您的HMAC提供MD5) -MD5)。

我之前没有共享秘密也没有DH攻击过这个问题。在这种情况下,嵌入式设备需要每个设备的公钥/私钥对(理想情况下在制造期间安装,但它可以在首次开机时计算并存储在非易失性存储器中;随机性很难,一个选项是让服务器提供一个随机数服务;如果你在芯片上有任何一个独特的非公开信息,比如一个序列号,也可以用来为你的密钥播种。最坏的情况是,你可以使用你的MAC加时间加上尽可能多的你可以从网络中找到熵。)

使用公钥/私钥,而不是使用HMAC,设备只是签署其消息,在其第一条消息中将其公钥发送到服务器。公钥成为设备的标识符。这种方法的好处是没有谈判阶段。设备可以开始说话,如果服务器从未听说过这个公钥,它会创建一个新记录。

这里有一个小的拒绝服务问题,因为攻击者可以用垃圾填满你的数据库。最好的解决方案是在制造过程中生成密钥,并立即将公钥插入数据库。这对一些合同制造商来说是不切实际的。因此,您可以使用包含设备可用于在第一次向服务器验证自身身份的共享密钥。这很弱,但对绝大多数情况来说可能已经足够了。