3

我有两个类“用户配置文件”和“指纹配置文件”,它们扩展了一个抽象类“配置文件”。

轮廓:

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

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

你需要问自己“安全防范什么?”。

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

  • 您无法保护内存数据免受在同一 JVM 中以完全权限运行的不受信任的代码的影响。

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


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

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

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

于 2012-12-19T15:33:03.440 回答
5

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

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

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

于 2012-12-23T11:32:51.583 回答