基本的には次のように機能するカスタムキー派生関数を実装する必要があります。
HSMの安全なコンテナーに暗号化キーKがあります。 Kはエクスポートできません。Kを使用する唯一の方法は、HSMコマンドまたはPKCS#11関数を使用することです。
派生キーDKは、キーKの暗号化データの出力なので、DK = E(data、K)です。
私の問題は、コマンドまたはPKCS#11関数を使用してこの関数を実装すると、HSMセキュアコンテナーの外部でDKのクリアテキストを取得することです。キーを保護して、安全なコンテナから離れないようにする必要があります。
HSMの安全なコンテナー内に、派生関数などのカスタム関数を実装して、出力を暗号化キーとして保護することはできますか? DKのクリアテキスト出力を取得せずにそれを行う方法?
一部HSMは、HSM内に機能を追加できるように十分に構成可能です。ただし、これは PKCS#11 では実行できません。これは、外部から提供されたデータで暗号アルゴリズムを呼び出すためのAPIです。 PKCS#11が提供し、問題に最も近いのは、暗号化されたキー(キーは別のキーで暗号化されています)を入力として受け取り、それを復号化できるC_UnwrapKey()
です。ただし、実装する必要のあるカスタムキー導出関数が、HSMが認識しているキー展開形式のいずれにも一致しない可能性があります(encryption、復号化ではありません)。
HSMの拡張機能については、PKCS#11の範囲外で発生するため、これがHSMでサポートされている場合は、そのHSMに固有のメソッドで実行されます。私は Thales HSM (以前は "nCipher"と呼ばれていました)の使用経験があります。関連するオプションをアクティブにした(つまり、料金を支払った)場合に、カスタムコードをHSMにプッシュできるものがあります。 CodeSafe 。私がそれを行っていたとき(現在は数年前)、開発はCで行われ、標準ライブラリのサブセットが大幅に削減されました。 HSM CPUはまったく高速ではありませんでした(ギガヘルツではなくメガヘルツと考えてください)。しかし、かなりの量のRAM(数十メガバイト))があり、最も重要なのは、暗号化アクセラレータを暗号化操作に使用できることです。