3

私は .NET 内で RSA がどのように機能するかについてもっと知りたいと思っていて、デフォルトでキーが Windows 内に保存されていることを示唆するこの役立つ投稿に出くわしました: https://stackoverflow.com/a/5845191/1181412

私の質問は、以下のサンプルコードを参照しています。その意図は、アプリケーション セッションの存続期間中のみワンタイム キーを生成することであると仮定します。

質問 1:以下の構造では、RSACryptoServiceProvider が同じ CspParameters オブジェクトにアクセスしている場合でも、クラス内の任意の場所で RSACryptoServiceProvider が作成されるたびに、PersistKeyInCsp フラグを false に設定する必要がありますか?

質問 2: CspParameters オブジェクトに CreateEphemeralKey フラグを設定すると、この例で PersistKeyInCsp を使用する必要がなくなりますか?

Public Class RSACrypto

    Private RSAKey As CspParameters

    Public Sub New(KeySize As Integer)
        MyBase.New()
        RSAKey = New CspParameters
        Using RSA As New RSACryptoServiceProvider(KeySize, RSAKey)
            RSA.PersistKeyInCsp = False
        End Using
    End Sub

    Public Function PublicKey() As Byte()
        Using RSA As New RSACryptoServiceProvider(RSAKey)
            RSA.PersistKeyInCsp = False
            Return RSA.ExportCspBlob(False)
        End Using
    End Function
End Class
4

1 に答える 1

0

CreateEphemeralKeyキー コンテナー名をnullCspParameters 構造体のままにしておくと (そして assert しないと) 、フラグがアサートされますUseDefaultKeyContainer

(または名前CreateEphemeralKeyを介して暗黙的に)作成されたキーの場合、プロパティは意味も効果もありません。名前付き (永続化) キーの場合、オブジェクトが破棄またはファイナライズされると、キーがディスクから削除されます。(異常終了はキーが削除されないことを意味することに注意してください)nullPersistKeyInCsp

質問 1: 以下の構造では、RSACryptoServiceProvider が同じ CspParameters オブジェクトにアクセスしている場合でも、クラス内の任意の場所で RSACryptoServiceProvider が作成されるたびに、PersistKeyInCsp フラグを false に設定する必要がありますか?

キーが永続化されていて、最初に設定PersistKeyInCsp=falseして呼び出したときにDispose()(直接またはusingステートメントを介して)、またはキーがガベージ コレクションされてファイナライズされると、その後のアクセスは失敗するか、別のキーが作成されます (UseExistingKeyフラグが断言)。ですから、「いいえ、そうすべきではありません」と言うのが最も正しいです。

質問 2: CspParameters オブジェクトに CreateEphemeralKey フラグを設定すると、この例で PersistKeyInCsp を使用する必要がなくなりますか?

はい。

暗黙の質問 3 : コードが機能しないのはなぜですか?

CspParameters.KeyContainerNameコンストラクターでは、 の値とシステム状態に応じて、次の 3 つの動作のいずれかが行われました。

  • KeyContainerName == null:
    • サイズ の一時キーを作成しましたKeySize。その後、廃棄しました。あなたの鍵が何であったかは誰にもわかりません。
  • 指定されたキーが存在しません:
    • サイズ の鍵ペアを生成し、KeySizeディスクに保存して削除しました。あなたの鍵が何であったかは誰にもわかりません。
  • 名前付きキーは存在しました:
    • キーペアを開きました (KeySizeは無視されました)。次に、ディスクから削除しました。あなたがそれを必要としなかったことを願っています。

メソッドでは、PublicKey1024 ビットの一時キーを作成するか ( の場合RSAKey.KeyContainerName == null)、既存のキーを開くか、1024 ビット キーを生成してディスクに永続化します。次に、公開キーの CAPI BLOB をエクスポートし、(一時的な場合) キーを破棄するか、(永続化されている場合) システムから削除します。(1024-bit-ness は、キーサイズ値なしで CspParameters ctor を使用したため、ctorKeySizeからの値は無関係です)

おそらくあなたが望んでいたのは、CspParameters ではなく、実際の RSA/RSACryptoServiceProvider オブジェクトを保存することでした。

于 2017-12-22T16:08:08.993 に答える