2017-04-10 3 views
1

APIコールのHMACシグネチャを作成するためにAESを使用します。ノンスが何であるか、なぜ重要であるのか理解していますが、実施される。AES:HMAC用の新しいキーを作成するためにナンスを使用

ノンスを使用してクライアントの秘密鍵を変更し、リプレイ攻撃で容易に悪用される可能性のあるコールに署名するための新しいシングルユース鍵を生成する考えがありました。

基本的な前提は、ログイン時に秘密鍵を取得し、transactionIDと新しいnonceを作成して返すセットアップAPIプロシージャを呼び出します。ユーザーは、独自の秘密鍵とナンスを組み合わせて、TransactionIDと他のいくつかのものに署名します。次に、サーバーは、そのユーザーの現在アクティブなノンスを使用して、このシグネチャの照合を試みます。

サーバーは自動的に古いナンスを消去し、新しいセットアップ呼び出しが行われるとそのサーバーを上書きします。このため、ユーザーは常にこのペアの順序に従わなければなりません(古いノンスが削除され、サーバーこの署名を受け入れなくなります)。

ノンスを使用する有効な方法であれば、クライアントのキーと組み合わせて有効なシークレットキーを取得するにはどうすればよいですか?

私は、AESプロバイダをこのように生成します。

private static AesCryptoServiceProvider GetProvider(byte[] key, byte[] IV) 
    { 
     AesCryptoServiceProvider result = new AesCryptoServiceProvider(); 
     result.BlockSize = 128; 
     result.KeySize = 256; 
     result.Mode = CipherMode.CBC; 
     result.Padding = PaddingMode.PKCS7; 

     result.IV = IV; 
     result.Key = key; 

     return result; 
    } 

は、私は私のキーは長く、常に32バイトAES-256を使用しています。しかし、ノンスを使って新しい鍵を作成したいのであれば、結果の文字列はもはや32バイトにならないので、単に連結することはできません。

固定長のハッシュ関数を連結して使用し、結果を32バイト長に戻す必要がありますか?または、AESCryptoServiceProviderのコンストラクタ/メソッドがあり、私が不足している不一致を自動的に処理しますか? または、私は平文のナンスを署名に付け加えて、サーバがそれらを別々に読んで直接チェックすることにしましたか?

+0

あなたの問題が解決された場合は、[同意する]ことができます(https://meta.stackexchange.com/q/5234/266187)。それができなかったら、間違っているものを広げてください。 –

答えて

1

これを解決する方法はたくさんあります。最も簡単なのは、ハッシングを使用することです。 HMACまたはHKDFを使用することもできます。

SessionKey = HMAC_SHA256(SecretKey, Nonce) 

ユーザーのSecretKeyのみ、他のキーを導出するために使用してください。あなたが別のもののために、この導出を使用する場合は、キーに用途をバインドする必要があります。

SessionKey = HMAC_SHA256(SecretKey, "Encryption".Concat(Nonce)) 
SessionToken = HMAC_SHA256(SecretKey, "Token".Concat(Nonce)) 

これは単なる擬似コードです。 HereはC#の実際のHMACの例です。

関連する問題