【问题标题】:Store secret key for TOTP存储 TOTP 的密钥
【发布时间】:2012-12-25 14:53:21
【问题描述】:

我希望设置我的网站 (C#/SQL 2008) 以允许使用 Google Authenticator 进行两因素身份验证。我的网站正常工作,从获取 QR 码到生成上一个/当前/下一个密钥(如果时钟不同步,我很乐意接受 3)。

显然我们需要为每个用户生成一个密钥,否则每个用户都将拥有相同的一次性密码。

我的问题是存储此密钥的最佳做法是什么?我可以将它作为纯文本存储在 users 表中,还是应该加密?

【问题讨论】:

    标签: sql-server-2008 authentication encryption google-authenticator


    【解决方案1】:

    为什么不 varchar ?据我所知,谷歌的二维码是一个字母数字字符串(你可以手写,以防你安装二维码扫描仪)

    在我的大学个人项目中,我生成了一个 128 个字符长的字母数字字符串,并将其发送到我的自定义 TOTP 应用程序,我的数据库将此信息存储为 VARCHAR(128) ,

    我认为最佳实践答案取决于密钥的大小以及密钥空间的定义方式,而不是 62 个字母数字,为什么不使用整个 ascii 表?您需要将密钥存储为 varbyte 吗?

    【讨论】:

    • 只要您的服务器是安全的,就不需要加密密钥,TOTP 系统应该简单地保护密钥不被公开访问,这意味着只要您的密钥存储在私有内存中安卓手机和你的安卓手机没有root,你的应用是安全的。只要您的服务器没有被黑客入侵,您的系统就是安全的。即使您尝试加密您的密钥,您将在哪里存储您的加密密钥?请注意,没有绝对安全之类的东西。
    • “只要你的服务器是安全的,就不需要加密密钥”。这对我来说听起来不太对劲。这不是说如果您的服务器没有被黑客入侵,那么您就不需要散列用户密码吗?当然,您会尽可能地保护服务器,但您仍然需要对用户密码进行散列和加盐以防万一。
    • 我期待这个:是的,你散列和加盐用户密码,但如果你想对 TOTP 密钥做同样的事情,那么你的 TOTP 客户端而不是密钥参数将不得不管理密钥和哈希来计算另一个密钥,因此您无法避免您的 TOTP 客户端将存储密钥的清晰版本
    • 请记住,TOTP 的全部意义在于,用于计算 RFC 6238 中 OTP 值的密钥应存储在防篡改介质中,并应防止未经授权的访问,这是可以实现的通过将此值设为私有。您无法真正实现 RFC 中的所有安全建议,因为这意味着创建硬件令牌而不是软件令牌。在这里阅读更多tools.ietf.org/html/rfc6238
    • 另外,当您可以将时间段从 1 分钟增加到 2 分钟或接受 1 分钟或 2 分钟的密钥时,您不应该为生成多个密钥而烦恼,谷歌身份验证器应该能够请求服务器时间,大多数安卓手机不应该有时间同步问题,因为它们都运行在 linux 时间
    猜你喜欢
    • 2017-07-21
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多