web-dev-qa-db-ja.com

RSAトークンはどのように機能しますか?

RSAトークン(SecurID)がどのように機能するか、そこで使用されるアルゴリズムは何ですか、それは通常のRSA暗号化/復号化と同じアルゴリズムですか?

38
Jau L

引用 Wiki

RSA SecurID認証メカニズムは、ハードウェア(USBドングルなど)またはソフトウェア(ソフトトークン)の「トークン」で構成され、コンピューターユーザーに割り当てられ、以下を使用して一定間隔(通常60秒)で認証コードを生成します。組み込みのクロックとカードの工場でエンコードされたランダムキー(「シード」と呼ばれます。シードはトークンごとに異なり、対応するRSA SecurIDサーバー(RSA Authentication Manager、以前はACE/Server)にロードされます)トークンが購入されます 1

そのため、RSA公開キーアルゴリズムに関連するものがある可能性があります。 SecurIDの実際の内部(隠蔽によるセキュリティ)についてはほとんど知られていませんが、いくつかの分析があります。 最初の証券分析 WikipediaのSecurIDページの下部にあります。

また、ハードウェアトークンは 改ざん防止 であるため、盗まれたトークンを複製することはほとんど不可能です。

更新:eyalerのおかげで、従来のSecurIDには公開/秘密キーがありません。それらは非対称アルゴリズムではなく、「共有秘密」に基づいています。ウィキペディアによると、AES-128のバリアントは、秘密キー(「シード」)からトークンコードを生成するために使用されます。秘密キーは工場でキーにエンコードされます。

18
osgx

http://seclists.org/bugtraq/2000/Dec/459 で実際にどのように行われているかを見ることができます。

(単純化された)メカニズムは

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

Blizzard Mobile Authenticatorsがどのように動作するのか、そのコード オープンソース化されています(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);
}

:すべてのコードはパブリックドメインにリリースされます。帰属は必要ありません。

7
Ian Boyd

@ VolkerKのanswer は、「64ビット」RSAトークンのアルゴリズムを記述するCコードにリンクします。RSAトークンは、本質的にカスタムアルゴリズム(リバースエンジニアリング〜2000)を使用します。

ただし、最新の「128ビット」トークン(ユビキタスSID700ハードウェアトークンと同等のソフトトークンを含む)で使用されるアルゴリズムに興味がある場合は、 stokenのソースコードをご覧ください。 、動作を完全に文書化するオープンソースプロジェクト。 securid_compute_tokencode はメインのエントリポイントです。

基本的に、アルゴリズムは次のように機能します。

  • 現在の時刻とシリアル番号からキーを生成します
  • 128ビットAESでシークレット/シードを繰り返し暗号化する
  • 出力の10進表現から数字を抽出し、PINを適切に追加する

オープンスタンダード [〜#〜] totp [〜#〜] アルゴリズム( Initiative For Open Authentication )のアルゴリズムとそれほど違いはありませんGoogle認証システムで使用されるYubiKey、 Symantec VIP access など)…EKSTRA SECURITEHのMOAR SPESHULおよびPROPRIETARY!

0
Dan Lenski

RFCを参照できます TOTP:Time-Based One-Time Password Algorithm

その中で明確に説明されているように、RSAトークン(SecurID)で使用される正確なアルゴリズムは、ハッシュアルゴリズムであるTOTP(Time-Based One-Time Password Algorithm)です。

シード(AES-128のバリアントによって生成される可能性があります)は、使用する前に既にトークンに保存されています。

0
kagb