最近,我的银行寄给我一款小设备,在执行在线交易时需要使用这个设备生成的唯一代码。该设备仅在我按下特定白色按钮时生成这个唯一代码,看起来并不像连接到远程服务器或其他类似的东西。
我进行了一些研究,进入了密码学领域,了解了一种叫做哈希函数的东西,但我仍然不明白它。
我的问题
- 我的银行服务器如何知道此设备生成的代码是正确的?
- 既然它只是每30秒生成五个随机数字,为什么服务器不会验证我决定使用的随机数?
最近,我的银行寄给我一款小设备,在执行在线交易时需要使用这个设备生成的唯一代码。该设备仅在我按下特定白色按钮时生成这个唯一代码,看起来并不像连接到远程服务器或其他类似的东西。
我进行了一些研究,进入了密码学领域,了解了一种叫做哈希函数的东西,但我仍然不明白它。
我的问题
这与哈希函数几乎没有关系。密码哈希函数可能是实现的一部分,但并不是必需的。
实际上,它是根据时间间隔生成数字的,如果我按下按钮让它生成数字,它会生成数字,在大约25秒后,我再次按下按钮,数字会改变,而不是在我刚刚按下按钮后立即再次按下按钮。
这就是提示。它是基于时间的伪随机或加密算法。根据时间,有一个代码。加密狗和服务器知道 - 或者更确切地说,可以计算出 - 每个窗口的代码。这是一个共享密钥 - 加密狗不连接到远程服务器。服务器可能会允许最近的一个或两个密钥,以防止您在传输途中输入已经过期的密钥。
虽然我最近使用Amazon Web Service multi-factor authentication时,当代码显示给我后,登录失败的时间不超过5秒。换句话说,有些供应商对其时间窗口非常严格。一如既往,这是安全性和可用性之间的权衡。
CodesInChaos提到的缩写是基于时间的一次性密码(TOTP)和HMAC-based One-Time Password (HOTP),这两个算法通常用于双重认证。
维基百科关于RSA SecurID的描述,它是一种双因素认证加密狗的特定品牌。
RSA SecurID身份验证机制包括“令牌”-硬件(例如USB加密狗)或软件(软令牌),分配给计算机用户,并使用内置时钟和卡片的工厂编码随机密钥(称为“种子”)在固定间隔(通常为60秒)生成认证代码。每个令牌的种子都不同,并在购买令牌时加载到相应的RSA SecurID服务器(RSA Authentication Manager,以前称为ACE / Server)中。我选择这篇文章是因为它有一个合理的物理描述;高级别的文章侧重于理论而不是物理实现。该文章还确认您需要保持令牌的机密性,否则其他人可以通过知道代码来模拟您的登录,就像您一样容易。令牌硬件设计为防篡改,以防止逆向工程。当同一算法的软件实现(“软件令牌”)出现在市场上时,安全社区开发了公共代码,允许用户在软件中模拟RSA SecurID,但前提是他们拥有当前的RSA SecurID代码和引入服务器的原始64位RSA SecurID种子文件。最后,在security.stackexchange姊妹站点的多因素标签下以及本站的two-factor-authentication标签下提供了更多信息。
我刚刚打开了一个旧的安全设备并对其进行了头脑风暴。
每个安全设备内部都有一个石英晶体,只要该晶体接通电源,它的生命周期就开始了(就像每个人出生到这个世界上一样),而且没有任何一个设备在完全相同的时间启动(由于不会在完全相同的时刻生成相同的数字),因此每当您按下按钮时,它会通过计算经过的时间(可能精度为1/1000000,因为我的设备显示6位数字,间隔为15秒)转换为唯一的数字。但是银行服务器如何知道我的唯一生成的数字呢?
可能银行正在计算您激活后经过的时间;因为您必须使用自己设备生成的唯一数字在第一次使用时激活这些安全设备。因此,在精确的时间计算中,银行服务器知道输入数字必须是xxx-xxx,并且随着时间的流逝而改变。
我确定即使您从未使用安全设备,设备电池也会在电池寿命期间为石英晶体提供电源。如果取出电池,则由于石英晶体未接通电源,无法生成数字,并且此时无法计算时间。因此,它永远不会再次生成相同的唯一数字。