RSA令牌如何运作?

时间:2011-12-01 11:19:28

标签: algorithm encryption cryptography rsa access-token

我想了解RSA令牌(SecurID)是如何工作的,那里使用的算法是什么,它是否与常规RSA加密/解密算法相同?

5 个答案:

答案 0 :(得分:18)

引用Wiki

  

RSA SecurID身份验证机制由“令牌”组成 - 硬件(例如USB加密狗)或软件(软令牌) - 分配给计算机用户并以固定间隔生成验证码(通常为60)秒)使用内置时钟和卡的工厂编码随机密钥(称为“种子”。每个令牌的种子不同,并加载到相应的RSA SecurID服务器(RSA身份验证管理器,以前的ACE /服务器) )购买代币时1

因此,它可能与RSA公钥算法有关。鲜为人知SecurID的真正内部(默默无闻的安全性),但有一些分析,例如: {/ 3}}以及维基百科中SecurID页面底部的更多内容。

此外,硬件令牌为initial securid analysis,因此几乎不可能复制被盗令牌。

更新:感谢eyaler,经典SecurID中没有任何公钥/私钥;它们基于“共享秘密”,而不是基于非对称算法。维基百科说,AES-128的变体用于从密钥(“种子”)生成令牌代码。密钥在工厂编码为密钥。

答案 1 :(得分:11)

您可以在http://seclists.org/bugtraq/2000/Dec/459

查看它是如何完成的

(过度简化)机制是

hash = <some initial value>
every x seconds do:
   hash = hashfunction(hash + secret_key)
   print hash

答案 2 :(得分:7)

我可以让您了解暴雪移动身份验证器的工作原理,因为他们的代码has been open-sourced. (archive)

简要的伪代码是:

String GetCurrentFOBValue()
{
   // Calculate the number of intervals since January 1 1970 (in UTC)
   // The Blizzard authenticator rolls over every 30 seconds,
   // so codeInterval is the number of 30 second intervals since January 1 1970.
   // RSA tokens roll over every minute; so your counter can be the number 
   // of 1 minute intervals since January 1, 1970
   // Int64 codeInterval = GetNumberOfIntervals();
   Int64 codeInterval = (DateTime.Now - new DateTime(1970,1,1)).TotalSeconds / 30;

   // Compute the HMAC_SHA1 digest of the code interval, 
   // using some agreed-upon 20-bytes of secret key material.
   // We will generate our 20-bytes of secret key material by
   // using PBKDF2 from a password. 
   // Blizzard's mobile authenticator is given secret key material
   // when it enrolls by fetching it from the web-site.
   Byte[] secret = PBKDF2("Super-secret password that our FOB knows", 20); //20 bytes

   // Compute a message digest of codeInterval using our shared secret key
   Byte[] hmac = HMAC(secret, codeInterval);

   // Pick four bytes out of the hmac array, and convert them into a Int32.
   // Use the last four bits of the digest as an index 
   // to which four bytes we will use to construct our Int32
   int startIndex = hmac[19] & 0x0f;

   Int32 value = Copy(hmac, startIndex, 4).ToUInt32 & 0x7fffffff; 

   // The blizzard authenticator shows 8 digits
   return String.Format("%.8d", value % 100000000);

   // But we could have just as easily returned 6, like RSA FOBs do
   return String.Format("%.6d", value % 1000000);
}
  

注意:任何代码都会发布到公共域中。无需归属。

答案 3 :(得分:0)

您可以参考RFC TOTP: Time-Based One-Time Password Algorithm

如上所述,RSA令牌(SecurID)中使用的确切算法是TOTP(基于时间的一次性密码算法),一种哈希算法。

种子(可能由AES-128的变体生成)在我们使用之前已经保存在令牌中。

答案 4 :(得分:0)

@VolkerK's answer链接到C代码,该代码描述了“64位”RSA令牌的算法,该算法使用基本上自定义的算法(逆向工程〜2000)。

但是,如果您对更现代的“128位”令牌(包括无处不在的SID700硬件令牌和等效的软令牌)使用的算法感兴趣,那么请查看{{3的源代码这是一个彻底记录其工作原理的开源项目; stoken是主要的切入点。

基本上,算法的工作原理如下:

  • 从当前时间和序列号生成密钥
  • 使用128位AES重复加密机密/种子
  • 从输出的十进制表示中提取数字并添加PIN以获得良好的衡量标准

与Google身份验证器,YubiKey,securid_compute_tokencode等中使用的开放标准TOTP算法(Initiative For Open Authentication的一部分)并没有什么不同......只是为了实现MOAR SPESHUL和所有权EKSTRA SECURITEH!