現在、Web アプリケーションに Jasypt を使用しています。正常に動作しますが、ホストされているサーバーによって暗号化が異なります。
このため、ライブ DB のデータを取得して、開発環境でのデバッグに使用することはできません。あれば便利だけど、なくても生きていける。
私が心配しているのは、現在ホスティングプロバイダーを使用していることです. これまでのところすべて問題ありませんが、ある時点でサーバーを交換したり、アプリケーションを別のサーバーに移動したりした場合、暗号化されたデータ (ログイン用の電子メールやパスワードなど) が暗号化されないのではないかと心配しています。すべてのデータが使用できなくなります。
プラットフォームに依存しないJasyptの代替手段を知っている人はいますか?
または、Jasypt 自体をプラットフォームに依存しないようにする方法はありますか?
ありがとう、ダン
PS:文字列暗号化(可逆)、パスワード暗号化(可逆ではないが同等)、および「SHA-1」暗号化という基本的な機能を備えた方法が必要です。最後の段落の用語が正しくない場合は申し訳ありませんが、私は暗号化の専門家ではありません。
ありがとう!
コード、結果、および例外を追加するために編集されました。
public class Test
{
public static void main ( String [] args )
{
System.out.println ( "String encryption = " + new EncryptionUtil ( ).encryptString ( "test string" ) );
System.out.println ( "Password encryption = " + new EncryptionUtil ( ).encryptPassword ( "test password" ) );
}
}
開発環境でこれを生成します:
String encryption = ybXukKBN57QSY8ITPgu9RmJQrZP4Py6g
Password encryption = nNX82PuKx5TrqBFSCy6yzNpco7Asov2S
毎回出力は異なりますが、文字列を復号化し、次のようにしてパスワードを比較することができます。
public class Decryption
{
public static void main ( String [] args )
{
System.out.println ( new EncryptionUtil ( ).decryptString ( "ybXukKBN57QSY8ITPgu9RmJQrZP4Py6g" ) );
System.out.println ( new EncryptionUtil ( ).passwordsMatch ( "test password", "nNX82PuKx5TrqBFSCy6yzNpco7Asov2S" ) );
}
}
次の出力が得られます。
test string
true
これは、私が作成した暗号化ユーティリティ クラスです。
public class EncryptionUtil
{
private String password = "<<=Encryption-Password=>>";
// ============================================================ Encrypt password string
public String encryptPassword ( String pwd )
{
if ( null != pwd && ! "".equals ( pwd ) )
{
return new BasicPasswordEncryptor ().encryptPassword ( pwd );
}
else
{
return "";
}
}
// ====================================== Check if password entered matches that stored
public boolean passwordsMatch ( String enteredPassword, String storedPassword )
{
return new BasicPasswordEncryptor().checkPassword ( enteredPassword, storedPassword );
}
//===================================================================== Encrypt string
public String encryptString ( String text )
{
if ( null != password && ! "".equals ( password ) )
{
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword ( password );
return textEncryptor.encrypt ( text );
}
else
{
return "";
}
}
// ===================================================================== Decrypt string
public String decryptString ( String text )
{
try
{
if ( null != text && ! "".equals ( text ) )
{
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword ( password );
return textEncryptor.decrypt ( text );
}
else
{
return "";
}
}
catch ( Exception e )
{
return text;
}
}
// =============== Encrypt email. Used for login and registration only, not decryptable
public String encryptEmail ( String email )
{
if ( null != email && ! "".equals ( email ) )
{
return new String ( new Digester("SHA-1").digest ( email.getBytes () ) );
}
else
{
return "";
}
}
}
LIVE環境でも同じことが私にこれを与えます:
String encryption = L/UlkJjYhLnYiov7XeDjb9W7+k8Gduvz
Password encryption = P+LJM7VJHu/hudSQOrmvcvV/DrzCv+pj
文字列を復号化してパスワードを確認しようとすると、次のようになります。
public class Decryption
{
public static void main ( String [] args )
{
System.out.println ( new EncryptionUtil ( ).decryptString ( "L/UlkJjYhLnYiov7XeDjb9W7+k8Gduvz" ) );
System.out.println ( new EncryptionUtil ( ).passwordsMatch ( "test password", "P+LJM7VJHu/hudSQOrmvcvV/DrzCv+pj" ) );
}
}
LIVE から取得した文字列 (上記のもの) を使用した結果は、次のようになります。
テスト文字列 false
今回は、文字列の暗号化は機能しますが (以前は機能していませんでした。正直に言うと、少し驚き、混乱しています)、パスワードは機能しません。
新しい編集 - 一部の文字列は、暗号化すると == で終わります。末尾に「==」がない文字列は、システム間で復号化できます。動作しないもの。ひょっとしてこれがヒントになるかも?