-1

1. 「pass123」のような SHA-1 パスワード、16 進数デコードの最初の 32 文字をキーとして使用それは十分に安全ですか?

パスワードを使用して安全にデータを暗号化するには、アプリケーションが必要です。これをグーグルで検索すると、あまりにも多くの異なることが出てきます。また、それについて理解できないこともあります。これは一般的な質問であり、特定のコーディング言語ではありません (ただし、これを Java と iOS で使用する予定です)。

これをより適切に実行しようとしているので、私が考えていることに従ってください。

  1. 入力は「pass123」などのパスワード、データは「銀行口座は038414838、暗証番号は5931」など暗号化したいもの

  2. PBKDF2 を使用して、パスワードからキーを取得します。パラメータ: 1000 反復の長さ 256 ビット ソルト - どこからソルトを取得すればよいかわからないため、これは私を混乱させます。たとえば、すべての暗号化では常にソルト「F」が使用されます (明らかにソルトは 1 文字である 8 ビットであるため)。

  3. 今、私はこのキーを取得し、それをハッシュしますか?? SHA-256 などを使用する必要がありますか? それは安全ですか?そして、HMACとは何ですか?私はそれを使うべきですか?注: 手順 2 と 3 の両方を実行する必要がありますか、それともどちらか一方だけで問題ありませんか?

  4. これで、暗号化に使用する 256 ビット キーを取得できました。そこで、AES を使用して暗号化を実行しますが、ここでさらに紛らわしい部分 (パラメーター) があります。使用するさまざまな「モード」が何であるかはよくわかりません.CBCやEBCなど、他にもたくさんあるようです.「初期化ベクトル」についてもわかりません.1つを作成して常にそれを使用しますか? ? では、他のオプションについてはどうでしょうか。PKCS7Padding とは何ですか?

4

1 に答える 1

1

あなたの最初のポイントについて:

  1. 16進数を使用すると、キーサイズが明らかに半分に分割されます。基本的に、セキュリティに関してAES-128を使用しています。それは悪いことではありませんが、AES-128を使用して16バイトを使用することもできます。
  2. SHA-1は鍵導出に対して比較的安全ですが、レインボーテーブルが存在/作成されているため、直接使用しないでください。このためには、反復回数とソルトを使用するPBKDF2のような関数が必要です。

解決策として:

  1. 回避できる場合は、PINを暗号化しないでください。パスワードが十分に安全であることを確認し、パスフレーズを許可してください。
  2. パスワードごとに乱数を作成し、PBKDF2の出力でソルト(16バイト)を保存します。ソルトはシークレットである必要はありませんが、セキュリティを強化するためにシステムシークレットを含めることもできます。ソルトとパスワードはハッシュ化されているため、PBKDF2と互換性のある任意の長さにすることができます。
  3. いいえ、PBKDF2によって生成されたシークレットを保存し、必要に応じてPBKDF2にさらにデータを生成させます。
  4. ECB(EBCではなく)は絶対に使用しないでください。最低限CBCを使用してください。CBC暗号化は、整合性チェック(誰かが暗号文を変更し、あなたがそれを知らない可能性があります)または信頼性を提供しないことに注意してください。そのためには、MAC、HMACを追加するか、GCMなどの暗号化モードを使用することをお勧めします。PKCS7Padding(ほとんどの場合PKCS5Paddingと同じ)は、ブロック単位の暗号化に必要なN*[blocksize]バイトを取得するために偽のデータを追加する簡単な方法です。

暗号化キーを再利用する場合に備えて、暗号文の前に(ランダムな)IVを追加することを忘れないでください。IVはソルトに似ていますが、正確に[blocksize]バイト(AESの場合は16)である必要があります。

于 2012-02-23T19:42:03.540 に答える