Javaを使用してスタンドアロンアプリケーションを開発しています。ログイン画面があり、ユーザーがユーザー名とパスワードを入力します。アプリケーションのインスタンスごとに、ユーザーは資格情報を入力する必要があります。使いやすさの観点から、「覚えていることを確認する」ボタンを維持することを考えました。私の質問は、私はデータベースを使用していないので、ユーザーの詳細をどのように保持するのかです。私はいくつかの大まかな考えを持っています。それらをプロパティファイルに保存して取得します。私が持っていたよりも良いアプローチがあるかもしれないと思います。アイデアや提案はありますか?
ユーザー資格情報をファイルに保存することは珍しいことではありません。次のように、各行が区切られたユーザー資格情報のセットであるテキストファイルを使用するのが一般的です。
user123:s8Z6dRBXxNHsh+qBLz1Tuw==
user789:EQrcOUm6Wau+VuBX8g+IPg==
形式は重要ではありませんが、クリアテキストのパスワードを保存しないことをお勧めします。上記の資格情報は、「不可逆」バイト配列を生成する暗号化ハッシュ関数を使用し、それをBase64エンコードしてASCII文字に削減します。これは「パスワードダイジェスト」と呼ばれます。人が自分のパスワードを入力すると、最初にダイジェスト形式に変換され、次に保存されているダイジェストと比較されます。
SHA1は推奨されるハッシュ関数であり、16進エンコードよりも小さいダイジェストを生成するため、Base64を使用しています。ここにいくつかのサンプルコードがあります:
import Java.io.UnsupportedEncodingException;
import Java.security.MessageDigest;
import Java.security.NoSuchAlgorithmException;
import org.Apache.commons.codec.binary.Base64;
public class TestAnything {
public static void main(String[] args) {
try {
System.out.println(pwdDigest("coverme"));
}
catch(NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
static String pwdDigest(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digestBytes = md.digest(password.getBytes("UTF-8"));
return new String(Base64.encodeBase64(digestBytes), "ASCII");
}
}
whereこのファイルを保存することも重要です。パスワードをハッシュ化するだけでは、データを保護するのに十分な方法ではありません。資格情報ファイルは、エンドユーザーがアクセスできないようにする必要があります。 SHA-1はアルゴリズム的には元に戻すことができませんが、ブルートフォース攻撃やレインボーテーブル攻撃の影響を受けやすいため、安全に保管する必要があります。特に弱いパスワードの場合。
おそらく、ユーザーがアクセスできないデータまたはリソースを保護しているため、パスワードを使用していると考えられます。データがない場合、またはファイルシステムからユーザーがデータにアクセスできる場合、アプリケーションを保護する意味のあるパスワードはありません。だから、何を保護しているのかわかりません。データベースがないと言っています。
ローカルファイルシステム上のデータを保護していて、1人のユーザーしかアクセスできない場合は、AES暗号を使用してデータを暗号化し、ユーザーのパスワードダイジェストを暗号化キーとして使用することをお勧めします。これの欠点は、ユーザーが自分のパスワードを変更できないことです。
共有ファイルシステムまたはタイムシェアリングPC上のデータを保護している場合、データはおそらくアクセス制御されたディレクトリに保存され、RSAなどの非対称鍵システムを使用してアクセスされる必要があります。
リモートサービスへのアクセスを保護する場合、パスワードはリモートシステムに保存する必要があります。
したがって、私たちはあなたが何を保護しているのかを本当に知る必要があります。