ロゴ画像のファイル名、データベース名、データベースユーザー、データベースパスワードなど、アプリのすべての情報を保存するプロパティファイルがJavaにあります。
プロパティファイルに暗号化されたパスワードを保存できます。ただし、キーまたはパスフレーズは、逆コンパイラを使用して jar から読み取ることができます。
db パスをプロパティ ファイルに安全に保存する方法はありますか?
ロゴ画像のファイル名、データベース名、データベースユーザー、データベースパスワードなど、アプリのすべての情報を保存するプロパティファイルがJavaにあります。
プロパティファイルに暗号化されたパスワードを保存できます。ただし、キーまたはパスフレーズは、逆コンパイラを使用して jar から読み取ることができます。
db パスをプロパティ ファイルに安全に保存する方法はありますか?
これを管理するには複数の方法があります。アプリケーションの起動時にユーザーにキーストアのパスワードを提供させる方法を見つけることができる場合、最も適切な方法は、キーを使用してすべての値を暗号化し、このキーをキーストアに保存することです。キーストアへのコマンド ライン インターフェイスは、keytool を使用します。ただし、JSE には、キーストアにプログラムでアクセスするための API もあります。
ユーザーが起動時に手動でキーストアにパスワードを提供することができない場合 (Web アプリケーションの場合など)、それを行う 1 つの方法は、キーを難読化して格納できる非常に複雑な難読化ルーチンを作成することです。プロパティファイルも。覚えておくべき重要なことは、難読化と難読化解除のロジックは多層化する必要があり (スクランブル、エンコーディング、偽の文字の導入などを含む可能性があります)、アプリケーション内の他のクラスに隠されている可能性のあるキーを少なくとも 1 つ持つ必要があるということです。直感的でない名前を使用しています。これは完全に安全なメカニズムではありません。なぜなら、逆コンパイラとかなりの時間と知性を備えた人ならまだ回避できるからですが、私が知っている唯一の方法で、ネイティブ (つまり、簡単に逆コンパイルできない) コードに侵入する必要はありません。 .
パスワードの SHA1 ハッシュをプロパティ ファイルに保存します。次に、ユーザーのパスワードを検証するときに、ログイン試行をハッシュし、2 つのハッシュが一致することを確認します。
これは、いくつかのバイトをハッシュするコードです。getBytes()
メソッドを使用して String からバイトを簡単に取得できます。
/**
* Returns the hash value of the given chars
*
* Uses the default hash algorithm described above
*
* @param in
* the byte[] to hash
* @return a byte[] of hashed values
*/
public static byte[] getHashedBytes(byte[] in)
{
MessageDigest msg;
try
{
msg = MessageDigest.getInstance(hashingAlgorithmUsed);
}
catch (NoSuchAlgorithmException e)
{
throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist. Epic fail, go change it in the Util file. SHA(1) or MD5");
}
msg.update(in);
return msg.digest();
}
いいえ、ありません。暗号化したとしても、誰かがそれを解読するコードを逆コンパイルします。
上記のようにパスワードを暗号化することに加えて、すべてのパスワードを別のプロパティ ファイルに入れ、展開時にこのファイルに可能な限りロックダウンされたアクセス許可を与えるようにしてください。
たとえば、アプリケーション サーバーが Linux/Unix で実行されている場合、パスワード プロパティ ファイルを 400/パーミッションでroot
所有するようにします。root
-r--------
もちろん、何らかの方法で認証した後、アプリにhttps経由でサーバーに接続してパスワードをダウンロードさせることはできませんでしたか?
パスワード (ダイレクト DB パスワードまたはキー パスフレーズのいずれか) 用に別のプロパティ ファイル (jar の外部) を作成し、そのプロパティ ファイルをディストリビューションに含めることはできません。または、なりすましが必要になるように、サーバーが特定のマシンからのログインのみを受け入れるようにすることもできます。