0

私は暗号化初心者ですが、データベースに保存する前に個人の機密データを暗号化する必要があります。CBC で AES を使用する予定でしたが、salt も使用したいと考えていました。ただし、これを行う方法を見つけることができませんでした (何らかの理由でホストが許可する準備ができていない BouncyCastle を除く) ため、暗号化するテキストの末尾にランダムな文字列を追加して、自分で追加することにしました。

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);

String plainText = "This is my plain text";
System.out.println("**plainText: " + plainText);

String saltedPlainText = plainText + UUID.randomUUID().toString().substring(0, 8);
byte[] encrypted = cipher.doFinal(saltedPlainText.getBytes());
String encryptedText = new String(new Hex().encode(encrypted));
System.out.println("**encryptedText: " + encryptedText);

cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);

byte[] decrypted = cipher.doFinal(new Hex().decode(encryptedText.getBytes()));
saltedPlainText = new String(decrypted);
plainText = saltedPlainText.substring(0, saltedPlainText.length()-8);

System.out.println("**plainText: " + plainText);

私は3つの質問があると思います:

  1. 暗号化にソルトを含めるより良い方法はありますか?
  2. このような例では、常に最初にランダムなキーが生成され、暗号化の直後に復号化が行われるようです。これはありそうもないシナリオです。そのため、毎回同じキーを使用する必要があることに基づいて作業しました (非常に簡単に思えますが、私が見たすべての例はランダムに見えるようです)。他にどのように機能するかわかりませんが、誰かが確認できます:)
  3. 固定キーを使用して作業すると、同じ文字列を暗号化し続けると、異なる結果が得られますが、暗号化された結果の最後の部分だけが変化することに気付きました。正しくないようです。どうして?

どうもありがとう、ニール

4

2 に答える 2

3

ソルティングは通常、プレーンテキストを暗号化するときではなく、パスワードをハッシュするときに行われます。たとえば、PBEKeySpecを使用してパスワードからキーを生成するときにソルトを使用します。AES の「ソルト」は、その初期化ベクトルです。

毎回同じ初期化ベクトルを使用しているため、同じ平文を暗号化するときに同じ暗号文を取得しています-IVをランダム化する必要があります(たとえば、SecureRandomを使用)またはカウンターからIVを生成する必要があります。IV は秘密ではなく (プレーンテキストで送信できます)、復号化は暗号化と同じ IV を使用する必要があります。

于 2013-04-23T21:46:57.040 に答える
1

なぜテキストに塩を追加するのですか? それは何もしません。

ソルトは通常、パスワードをハッシュしてレインボー テーブルを無効にするために使用されます。次のように動作します: ユーザーがパスワード「qwerty」を入力するとします。16 バイト長のランダム文字列 (rs) を生成し、それをパスワードに追加し、結果の文字列をハッシュしてから、ハッシュを取得し、それに rs を追加して、結果の文字列をデータベースに保存します。

于 2013-04-23T21:51:46.810 に答える