python - 是否可以在服务器上加盐和/或散列 HOTP/TOTP secret ?

标签 python authentication encryption google-authenticator

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

由于 HOTP 密码与用户密码非常相似,我认为应该应用类似的最佳实践。特别是强烈建议永远不要存储未加密的密码,只保留密码的加盐哈希值。

RFC 和 HOTP/TOTP 的 python 实现似乎都没有涵盖这方面。

有没有一种方法可以使用 OTP 共享 key 的单向加密,或者这是一个愚蠢的想法?

最佳答案

Is there a way to use one-way encryption of the OTP shared secret...?

不是真的。您可以使用可逆加密机制,但这可能没有多大意义。

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

why do we apply 1-way function to a password before storing it (salt+hash)...?

这实际上是个好问题。

我认为这是因为早期版本的 Unix 操作系统将其所有密码信息存储在一个“世界可读”的 /etc/passwd 文件中,因此显然必须对其进行混淆处理在某种程度上,salt+hash 恰好是他们选择的方法。

如今,人们通常不会如此自由地提供他们的密码文件,因此可以说根本不需要对它们进行哈希处理。

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

因此,如今散列密码的主要原因与其说是为了提高系统的安全性,不如说是为了降低危及用户在其他系统上的安全的风险,如果您的系统已被破坏。

如果攻击者可以从您的系统中读取明文密码,这对他们来说可能没有多大用处,因为无论如何他们也可能读取系统上的所有其他内容。

但是,如果在另一个系统上也使用了相同的密码,那么您可能已经为攻击者提供了破坏该系统的方法。

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

关于python - 是否可以在服务器上加盐和/或散列 HOTP/TOTP secret ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15962195/

相关文章:

java - 具有两个上下文的 JBOSS 7。一个使用 SSL Mutual Auth,另一个仅使用 SSL

c# - Windows 7 Home Premium 是否允许 (File.Encrypt)?

java - 这是否使用 256 位 AES 加密?

python - urllib和 “SSL: CERTIFICATE_VERIFY_FAILED”错误

python - Python 中的可链接动态属性

java - 来自 Java 的 HDFS - 指定用户

authentication - 无法使用 x509 证书在 Kubernetes 中对用户进行身份验证

javascript - 如何在 Javascript 的个人加密中获得无限字符

python - isinstance(type, object) = True,为什么?

python - Django 聚合 : Summation of Multiplication of two fields