【问题标题】:Should the secret key for Google Authenticator be kept secret?Google Authenticator 的密钥是否应该保密?
【发布时间】:2019-03-29 12:51:42
【问题描述】:

我正在使用 pyotp https://github.com/pyotp/pyotp 将我的应用程序与 Google Authenticator 集成。

文档建议使用 qrious https://github.com/neocotic/qrious 这很好,效果很好。本质上 qrious 能够纯粹在浏览器中生成二维码。在这种情况下,供应 URI 被传递给 QR 码生成器,并由此生成 QR 码。

让我感到困惑的是,配置 URI 包含密钥,但我们将这个 URI 发送到客户端,由 qrious 将其转换为 QR 码。所以密钥不是秘密的,因为它已经发送给客户端了。

我原以为永远不能从后端发送密钥 - 我不明白什么?

# generate a base32 secret key
>>> pyotp.random_base32()
'55OZSEMXLL7VAUZP'
# make a provisioning_URI
>>> provisioning_URI = pyotp.totp.TOTP('55OZSEMXLL7VAUZP').provisioning_uri('someperson@example.org',issuer_name="FooCorporation")
>>> provisioning_URI
'otpauth://totp/FooCorporation:someperson%40example.org?secret=55OZSEMXLL7VAUZP&issuer=FooCorporation'
>>>

provisioning_URI 被发送到浏览器以转换为 QR 码 - 但它包含密钥 - 这肯定不安全吗?

【问题讨论】:

  • 此上下文中的密钥是服务器和客户端之间的共享密钥。每个客户都不同。
  • 所以秘密不是应用程序范围的秘密?是否需要为该用户存储在数据库字段中,并在用户向后端提交 Google Authenticator 代码时检索以进行验证?
  • 您将需要它来验证代码。

标签: python authentication one-time-password


【解决方案1】:

是的,您应该对其他人保密,并仅与目标用户共享二维码,以便他们使用手机应用程序对其进行扫描。你是对的。将其发送到客户端是有风险的,但即使您要在服务器上生成 QR 码并将其显示给用户,它仍然有可能随时受到损害。用户的手机也可能被盗。所以有很多风险。但最好在服务器上生成二维码并将其呈现给用户,以便他们扫描。只是不要使用任何远程解决方案或任何浏览器扩展来生成代码,让您的生活更轻松。

简而言之,您永远不应该单独考虑这种形式的验证,并且这种验证应该始终仅在用户输入并验证其密码后实施。

在您的服务器上存储密钥时,您应该始终使用technique like this 对其进行加密,然后在需要密钥进行验证时即时解密。显然,秘密应该为每个用户单独生成,否则,这是没有意义的。如果您将使用相同的秘密,则只需交换他们的电子邮件即可为任何用户生成秘密。

我将在此再次重申,绝不应将 2FA 视为独立的安全措施。它应该始终作为身份验证的第二层来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2022-09-29
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多