Sql server 2008 存储TOTP的密钥

Sql server 2008 存储TOTP的密钥,sql-server-2008,authentication,encryption,google-authenticator,Sql Server 2008,Authentication,Encryption,Google Authenticator,我希望设置我的网站(C#/SQL 2008),允许使用Google Authenticator进行双因素身份验证。我的网站正在运行,从获取二维码到生成上一个/当前个/下一个键(如果时钟不同步,我很乐意接受3个) 显然,我们需要为每个用户生成一个密钥,否则每个用户都将拥有相同的一次性密码 我的问题是存储此密钥的最佳实践是什么?我可以将其作为纯文本存储在用户表中,还是应该对其进行加密?为什么不varchar?据我所知,谷歌的二维码是一个字母数字字符串(如果你不想安装二维码扫描仪,你可以手工书写) 在

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

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


我的问题是存储此密钥的最佳实践是什么?我可以将其作为纯文本存储在用户表中,还是应该对其进行加密?

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

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


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

只要您的服务器是安全的,就不需要加密密钥,TOTP系统应该简单地保护密钥不被公众访问,这意味着只要您的密钥存储在android手机的私有内存中,并且您的android手机没有根,您的应用程序就是安全的。只要你的服务器没有被黑客入侵,你的系统就是安全的。即使您尝试加密您的密钥,您将在哪里存储加密密钥?请注意,没有绝对安全这一事实。“只要您的服务器是安全的,就不需要加密密钥”。我觉得这不太对。这难道不等于说如果你的服务器没有被黑客攻击,那么你就不需要散列用户密码吗?当然,你尽可能地保护服务器,但你仍然会对用户密码进行哈希和salt,以防万一。我希望这样:是的,你会对用户密码进行哈希和salt,但是如果你想对TOTP密钥执行相同的操作,那么你的TOTP客户端将不得不管理一个密钥和一个哈希来计算另一个密钥,而不是一个密钥参数,因此,您无法避免这样一个事实,即您的TOTP客户端将存储一个清晰版本的密钥。请记住,TOTP的全部要点是,用于计算RFC 6238中的OTP值的密钥应存储在防篡改介质中,并应防止未经授权的访问,这是通过将该值私有化来实现的。您无法真正实现RFC中的所有安全建议,因为这意味着创建硬件令牌而不是软件令牌。阅读这里的更多内容,当您可以将时间段从1分钟增加到2分钟或接受1分钟的旧密钥或2分钟的密钥时,您不应该为生成多个密钥而烦恼,而且google authenticator应该能够请求服务器时间,大多数android手机不应该有时间同步问题,因为它们都在linux时间上运行