是否可以在服务器上加盐和/或散列HOTP/TOTP密码?

Pau*_*aul 12 python authentication encryption google-authenticator

我正在构建一个基于TOTP/HOTP的双因素身份验证系统.为了验证otp,服务器和otp设备必须知道共享密钥.

由于HOTP秘密与用户密码非常相似,我认为应该采用类似的最佳实践.具体而言,强烈建议永远不要存储未加密的密码,只保留密码的盐渍哈希值.

无论是RFC还是HOTP/TOTP的python实现似乎都没有涵盖这方面.

有没有办法使用OTP共享密钥的单向加密,还是一个愚蠢的想法?

Aya*_*Aya 6

有没有办法使用OTP共享密钥的单向加密......?

并不是的.您可以使用可逆加密机制,但可能没什么意义.

如果客户端通过网络发送完整的未散列HMAC密钥进行身份验证,您只能在服务器上散列HMAC密钥,这通常是基于密码的身份验证的工作原理,但这很容易受到重放攻击,这正是HOTP/TOTP旨在避免.

为什么我们在存储之前将单向函数应用于密码(salt + hash)......?

这实际上是一个很好的问题.

我认为这是因为早期版本的Unix操作系统将其所有密码信息存储在"世界可读"的/etc/passwd文件中,因此它们显然必须以某种方式进行模糊处理,并且盐+哈希恰好就是方法他们选择了.

如今,人们通常不会使他们的密码文件如此免费,因此可以说根本不需要对它们进行哈希处理.

然而,还有另一个混淆它们的原因,即密码通常由人类选择,因此,为方便起见,它们通常会为多个系统选择相同的密码.我怀疑HMAC密钥是否也是如此,它们(希望)使用加密更强的机制进行选择.

因此,现在哈希密码的主要原因不是增加系统的安全性,而是为了降低在系统受到危害时损害用户在其他系统上的安全性的风险.

如果攻击者可以从您的系统中读取明文密码,则可能对他们没什么用处,因为他们可能还会读取系统上的其他所有内容.

但是,如果在另一个系统上也使用了相同的密码,那么您可能会给攻击者提供危害该系统的方法.

如果人们可以信任不要为多个系统使用相同的密码,那么可能根本不需要对它们进行哈希处理,但我认为假设有可能发生这种情况有些乐观.:-)