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