我对密码学非常陌生,我一直在研究基于时间的OTP( TOTP ),虽然我已经了解了计算的工作原理,但我无法理解为什么使用TOTP会使系统更安全。
这是我所理解的。TOTP用于2FA,所以第一个因素是您的用户名和密码。正如我们所知,这本身并不十分安全,因此我们使用第二个因素,这里是OTP。
因此,对于TOTP,服务器和客户端都有一个秘密密钥。所以我的问题是,如果攻击者获得了这个秘密的访问权限,他就不能像生成我系统上的客户端软件一样容易生成OTP吗?因为HOTP(密钥,计数器)对所有人来说都是一样的吗?因此,为了确保TOTP是有用的,我必须确保与客户端的密钥是安全的?假设我正在制作一个将由公众使用的软件,它使用基于TOTP的身份验证。那么,我会在每个客户端附加一个不同的秘密,并在服务器端维护一个数据库以匹配秘密服务器端吗?
如果不是,在这种情况下,在客户机和服务器上拥有相同秘密的安全方法是什么?
发布于 2017-09-03 20:42:01
所以我的问题是,如果攻击者获得了这个秘密的访问权限,他就不能像生成我系统上的客户端软件一样容易生成OTP吗?因为HOTP(密钥,计数器)对所有人来说都是一样的吗?
是的,如果攻击者知道你共享的秘密,他可以随时计算OTP。但这是不太可能的,因为每个秘密都是唯一的(不重复使用密码),并且从未传输(除了最初的协议外)服务器或客户端令牌的直接攻击是获得它的唯一可能性。
因此,为了确保TOTP是有用的,我必须确保与客户端的密钥是安全的?
对,是这样。
假设我正在制作一个将由公众使用的软件,它使用基于TOTP的身份验证。那么,我会在每个客户端附加一个不同的秘密,并在服务器端维护一个数据库以匹配秘密服务器端吗?
是。每个用户在服务上都有不同的密钥。如果您将其存储在数据库中,或者通过某种确定性计算从主秘密获得,则取决于您的实现。
发布于 2017-11-15 18:29:51
由于您已经将用户的密码与从应用程序的数据库中获得的(大概是哈希)值进行比较,所以您有一个相当安全的方法来存储您可以使用的秘密服务器端。
您可以将OTP秘密以加密形式存储在数据库中,使用用户的密码作为加密秘密的一部分,然后在身份验证流程中解密该秘密,以验证用户提供的OTP。
一种可能的工作流程是使用像PBKDF2这样的工具来增强用户的密码,并使用对您的用例足够安全的密码套件进行加密(对于大多数用例来说,AES-256可能是一个很好的选择)。
这对于HOTP和TOTP都是有效的,它将保护您和您的用户免受简单的数据库破坏。当然,您仍然需要遵守标准的安全实践,并且用户仍然需要尽自己的力量来确保OTP秘密和/或设备的安全性。
发布于 2017-09-06 04:01:47
OTP需要客户端和服务器之间共享密钥,如果入侵者学习了密钥,他就可以像客户端一样计算OTP。所以你得保守秘密钥匙。
尽管如此,还是有办法提供额外的保护,即使是在秘密钥匙被偷的情况下。这可以使用密码社区中所谓的“默默无闻”来完成,这意味着隐藏用于OTP的算法的细节。这样,如果黑客进入web服务器并为客户端窃取包含所有OTP秘密密钥的表,他将无法使用该表,直到他了解该算法是如何工作的。
https://crypto.stackexchange.com/questions/51287
复制相似问题