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

时间:2012-12-19 15:22:06

标签: java design-patterns passwords abstract-class 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;
    }

}

我的下一课是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方法是私有)。

在制作我的FingerPrintProfile类以及拥有“FingerprintData”对象时,我似乎会遇到同样的问题,该对象本身也需要是安全的。

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

谢谢!

奖金问题

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

3 个答案:

答案 0 :(得分:7)

使用密码时,您可能应该使用某种形式的加密,因此密码不会以纯文本格式存储。您可以了解其工作原理here

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

答案 1 :(得分:5)

  

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

你需要问自己“对抗什么?”。

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

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

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


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

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

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

答案 2 :(得分:4)

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

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

Getter / setter是OOP中的反模式。