最理想的方法是在类中保存密码 - Java

Tom*_*eck 2 java passwords abstract-class design-patterns password-protection

我有两个类"User Profile"和"FingerprintProfile",它们扩展了一个抽象类"Profile".

轮廓:

/**
 * 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我的下一课是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;

    }

}
Run Code Online (Sandbox Code Playgroud)

只是看这个类看起来很狡猾,能够像这样检索密码似乎完全错误(即使get方法是私有的).

在制作我的FingerPrintProfile类时,似乎我将面临同样的问题,并且它拥有一个本身也需要安全的"FingerprintData"对象.

有人知道一种安全的方法,或者最好是一种人们用来解决这种情况的模式吗?

谢谢 !

奖金问题

我创建了抽象类来为两种类型的配置文件提供模板,似乎指纹数据和文本密码之间存在共同点.但是,不可能创建一个抽象字段"password",它可能是char数组或FingerprintData对象.有任何想法吗??

pen*_*ext 7

使用密码时,您可能应该使用某种形式的加密,因此密码不会以纯文本格式存储.你可以在这里阅读它的工作原理.

是Bcrypt的Java实现的链接,至少应该让您入门.


Ste*_*n C 5

有人知道一种安全的方法,或者最好是一种人们用来解决这种情况的模式吗?

你需要问自己"对抗什么?".

当然,如果在与此类相同的JVM中执行某些不受信任的代码,则可以获取密码.但为什么你会允许这种情况发生?

  • 您无法在同一JVM中使用具有完全权限的不受信任代码保护内存中数据.

  • 如果您小心,可以保护数据免受安全沙箱中运行的不受信任的代码的影响; 例如,通过创建自定义a Permission并使用SecurityManager来检查(比方说)getPassword方法的调用者是否具有所需的权限.(你还需要做其他一些事情......)


话虽如此,处理密码的"最佳实践"方法是使用(真正的)安全散列算法创建和存储种子散列.你可以在这里做同样的事情.问题在于,如果你确实需要明确的密码,那将无法正常工作......因为哈希的整个想法是让恢复密码变得不可行.但另一方面,如果密码一目了然,坏人可能会抓住它.

存储加密的密码对于JVM中的不受信任的代码是不安全的.给定时间,精力以及不信任与坏人之间的隐蔽信息通道,应该可以恢复所使用的密钥和算法,从而解密数据.坏人可能通过核心转储或通过读取JVM进程的页面文件来获取信息.

最重要的是,如果您的平台安全性被破坏(JVM或操作系统),您无法保证以明文或加密方式保存的密码将保持安全.


yeg*_*256 5

改用“对象思维”。您当前的设计根本不是 OOP。您应该公开配置文件的行为,而不是设置和获取密码。例如:

interface Profile {
  void rename(String name);
  String identity();
  boolean authenticate(char[] password)
}
Run Code Online (Sandbox Code Playgroud)

Getters/setters 是 OOP 中的一种反模式。