我正在构建一个基于TOTP / HOTP的双因素身份验证系统。 为了验证otp,服务器和otp设备必须知道共享密钥。
由于HOTP秘密与用户密码非常相似,我认为应该采用类似的最佳做法。具体而言,强烈建议永远不要存储未加密的密码,只保留密码的盐渍哈希值。
无论是RFC还是HOTP / TOTP的python实现似乎都没有涵盖这方面。
有没有办法使用OTP共享密钥的单向加密,还是一个愚蠢的想法?
答案 0 :(得分:6)
有没有办法使用OTP共享密钥的单向加密......?
不是真的。您可以使用可逆加密机制,但可能没什么意义。
如果客户端通过网络发送完整的未散列HMAC密钥进行身份验证,则只能对服务器上的HMAC密钥进行哈希处理,这通常是基于密码的身份验证的工作原理,但这样会容易受到重放攻击,这正是HOTP / TOTP旨在避免的。
为什么我们在存储之前将单向函数应用于密码(salt + hash)......?
这实际上是一个很好的问题。
我认为这是因为早期版本的Unix操作系统将其所有密码信息存储在“世界可读的”/etc/passwd
文件中,因此它们显然必须以某种方式进行模糊处理,并且盐+ hash恰好是他们选择的方法。
如今,人们通常不会使他们的密码文件免费提供,因此根本不需要对它们进行哈希处理。
然而,还有另一个混淆它们的原因,即密码通常由人类选择,因此,为方便起见,它们通常会为多个系统选择相同的密码。我怀疑HMAC密钥是否也是如此,它们(希望)使用加密更强的机制进行选择。
因此,现在哈希密码的主要原因不是增加系统的安全性,而是为了降低在其他系统上损害用户安全性的风险,系统受到了损害。
如果攻击者可以从您的系统中读取明文密码,那么对他们来说可能没什么用处,因为他们可能还可以读取系统上的其他所有内容。
但是,如果在另一个系统上也使用了相同的密码,那么您可能会给攻击者提供危害该系统的方法。
如果人们可以信任不为多个系统使用相同的密码,那么可能根本不需要对它们进行哈希处理,但我认为假设有可能发生这种情况有些乐观。 : - )
答案 1 :(得分:0)
定义:HOTP(K,C) = Truncate(HMAC(K,C)) & 0x7FFFFFFF
- 其中K
是密钥,C
是计数器。它的设计使得黑客无法获得K
和C
,因为他们拥有HOTP字符串,因为HMAC是单向散列(不是双向加密)。
K
& C
需要得到保护,因为丢失会损害整个OTP系统。话虽如此,如果在字典中找到K
并且我们知道C
(例如:当前时间),我们可以生成整个HOTP / TOTP字典并找出K
。< / p>
将单向加密应用于HOTP / TOTP(即:双重加密)在数学上会使解码变得更加困难,尽管它不会阻止其他形式的攻击(例如:击键记录)或对字典列表应用相同的加密HOTP / TOTP。
重复使用同一套易于记忆的密码是一切的人性,因此需要在数字设备上或通过互联网传输时隐藏此密码。
安全程序或协议的实施也是至关重要的,就像选择一个好的密码K
,但让每个人都在桌子周围,或者持有K
(对于HMAC)的服务器不是在由几层防火墙保护的专用网络内。