Google身份验证器的密钥是否应该保密?

时间:2018-10-25 02:03:51

标签: python authentication one-time-password

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

文档建议使用qrious https://github.com/neocotic/qrious很好,并且效果很好。本质上,qrious能够纯粹在浏览器中生成QR码。在这种情况下,将预配置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码-但其中包含密钥-确定不安全吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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