3

抽象クラス「Profile」を拡張する「UserProfile」と「FingerprintProfile」の2つのクラスがあります。

プロフィール:

/**
 * Template for User profiles or Fingerprint profiles
 */
public abstract class Profile {

    /**
     * Profile Name
     */
    private String name;

    /**
     * Profile id
     */
    private int id;

    /**
     * Set the name of this profile
     * @param name
     */
    public void setProfileName(String name) {
        this.name = name;
    }

    /**
     * Set the id of this profile
     * @param name
     */
    public void setIdNumber(int id) {
        this.id = id;
    }

    /**
     * Get the name of this profile
     */
    public String getProfileName() {

        return name;

    }

    /**
     * Get the id of this profile
     */
    public int getIdNumber() {
        return id;
    }

}

次のクラスはUserProfileです

public class UserProfile extends Profile {

    /**
     * Users password
     */
    private char[] password;

    /**
     * Set User password
     * @param password
     */
    public void setPassword(char[] password){

        this.password = password;

    }

    /**
     * Get User password
     */
    public char[] getPassword(){

        return password;

    }

}

このクラスを見るだけでは危険なようですが、このようにパスワードを取得できるのはまったく間違っているようです(getメソッドがprivateの場合でも)。

FingerPrintProfileクラスを作成するときに同じ問題に直面するようです。また、本質的に安全である必要がある「FingerprintData」オブジェクトを保持しているようです。

安全な方法、またはできればこのようなシナリオを解決するために人々が使用するパターンを知っている人はいますか?

ありがとう !

ボーナス質問

両方のタイプのプロファイルのテンプレートを提供するために抽象クラスを作成しましたが、指紋データとテキストパスワードの間には共通の根拠があるようです。ただし、char配列またはFingerprintDataオブジェクトになる可能性のある抽象フィールド「パスワード」を作成することはできません。何か案は??

4

3 に答える 3

8

パスワードを使用する場合は、パスワードがプレーンテキストで保存されないように、何らかの暗号化を使用する必要があります。これがどのように機能するかについては、こちらをご覧ください。

これはBcryptのJava実装へのリンクです。少なくとも始める必要があります

于 2012-12-19T15:31:19.487 に答える
5

代わりに「オブジェクト思考」を使用してください。現在の設計はOOPではありません。パスワードを設定して取得する代わりに、プロファイルの動作を公開する必要があります。例えば:

interface Profile {
  void rename(String name);
  String identity();
  boolean authenticate(char[] password)
}

ゲッター/セッターはOOPのアンチパターンです。

于 2012-12-23T11:32:51.583 に答える
5

安全な方法、またはできればこのようなシナリオを解決するために人々が使用するパターンを知っている人はいますか?

あなたは自分自身に「何に対して安全か」と自問する必要があります。

確かに、信頼できないコードがこのクラスと同じJVMで実行された場合、パスワードを取得する可能性があります。しかし、なぜあなたはそれが起こるのを許しますか?

  • 同じJVMで完全な権限で実行されている信頼できないコードに対してメモリ内データを保護することはできません。

  • 注意すれば、セキュリティサンドボックスで実行されている信頼できないコードからデータを保護できます。たとえば、カスタムaを作成し、Permissionを使用してSecurityManager、(たとえば)メソッドの呼び出し元がgetPassword必要な権限を持っていることを確認します。(そして、他にもいくつか行う必要があります...)


そうは言っても、パスワードを処理する「ベストプラクティス」の方法は、(本当に)安全なハッシュアルゴリズムを使用してシードされたハッシュを作成して保存することです。ここでも同じことができます。キャッチは、実際にパスワードを明確にする必要がある場合、それは機能しないということです...ハッシュの全体的な考え方は、パスワードを回復することを実行不可能にすることであるためです。ただし、逆に、パスワードが明確になっていると、悪意のあるユーザーがパスワードを取得する可能性があります。

暗号化されたパスワードの保存は、JVM内の信頼できないコードに対して安全ではありません。時間、労力、および信頼できない人と悪意のある人の間の秘密の情報チャネルを考えると、使用されたキーとアルゴリズムを回復し、データを復号化できるはずです。また、悪意のあるユーザーは、コアダンプを介して、またはJVMプロセスのページングファイルを読み取ることにより、情報を入手できる可能性があります。

つまり、プラットフォームのセキュリティ(JVMまたはOSのいずれか)が侵害された場合、クリアまたは暗号化された状態で保持されているパスワードが安全に保たれることを保証することはできません。

于 2012-12-19T15:33:03.440 に答える