使用一次性密码解决方案更安全地验证身份
2009-02-09 10:20:21 来源:WEB开发网Web 服务提供一个 Web 方法 VerifyOtpCode(在身份验证成功时它将返回 true)。该方法首先加载与身份验证请求中指定的用户名相对应的 SQL Server 数据库行。如果 SQL Server 无法找到匹配行,该方法将返回 false。
如果在 SQL Server 数据库中找到相应用户名,该方法将把以下数据项传给本机 GenerateOTP:请求中指定的 OTP 值、用户密钥(从 SQL Server 中检索得到)以及计数器值(也从 SQL Server 中检索得到)。
GenerateOTP 将使用连续的计数器值进行反复尝试,直到返回匹配的 OTP 值或者已检查过 1,000 个连续的计数器值。尽管不太可能从上次成功身份验证后重复尝试一千次,但它可能使用户意外将客户端计数器运行至脱机!
通过缩小此范围,还可使攻击者实际猜测的 OTP 值与序列中的值恰好相等的机率更低,但它会增加用户意外将客户端计数器运行至超出服务器允许范围的可能性。在后一种情况下,需要请求管理员介入才能使用户能够再次进行身份验证。
如果在计数器范围内找到匹配的 OTP 值,则将把新的计数器值写回数据库。然而遗憾的是,这需要身份验证 Web 服务具有数据库的写入权限,并且如前所述,由于必须确保计数器值不发生重用,因此它对于 OTP 的安全性而言也至关重要。(为使一次性密码唯一,必须保证它实际仅被使用一次。)
具有简单架构的 SQL Server 数据库可用于存储用户名及对应的 OTP 密钥或种子值。还可扩展该构架以包含登录信息(如使用 OTP 成功登录和不成功登录的次数和时间)。该数据库由 Username、SecretCode 和 Counter 列组成。有关每个元素的解释,请参阅“身份验证 Web 服务”一节。示例代码附带的数据库副本仅包含一个存储用户名“testuser”的行。
更多精彩
赞助商链接