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

在类中保存密码最理想的方法-Java,java,design-patterns,passwords,abstract-class,password-protection,Java,Design Patterns,Passwords,Abstract Class,Password Protection,我有两个类“用户配置文件”和“指纹配置文件”,它们扩展了一个抽象类“配置文件” 简介: /** * Template for User profiles or Fingerprint profiles */ public abstract class Profile { /** * Profile Name */ private String name; /** * Profile id */ private int

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

简介:

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

在创建指纹配置文件类以及保存“指纹数据”对象(本质上也需要安全)时,似乎我将面临同样的问题

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

谢谢

奖金问题


我创建了一个抽象类来为这两种类型的概要文件提供模板,似乎指纹数据和文本密码之间有一个共同点。但是,不可能生成一个抽象字段“password”,它可能是字符数组或指纹数据对象。有什么想法吗

在使用密码时,您可能应该使用某种形式的加密,这样密码就不会以纯文本形式存储。你可以详细了解这是如何工作的

是指向Bcrypt的Java实现的链接,它至少可以帮助您入门

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

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

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

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

  • 如果你很小心,你可以保护数据不受不信任的代码运行在一个安全沙箱;e、 g.通过创建自定义
    权限
    并使用
    安全管理器
    检查
    getPassword方法的调用方是否具有所需的权限。(你还需要做一些其他的事情……)


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

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

底线是,如果您的平台安全性遭到破坏(JVM或操作系统),您无法保证以明文或加密形式保存的密码将保持安全。

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

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

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

密码加密了吗?不,密码没有加密,你看的是我所处的开发阶段。谢谢你的回答,这就是我说“似乎”错了的意思。一个objects字段可以用纯文本保存密码似乎是不对的。如果存储密码的操作系统没有,为什么我的应用程序应该这样做?那么我应该在具体类中填写名称/密码字段吗?我还可以为每个类使用不同的身份验证方法,即指纹与用户?这取决于您的实现
authenticate()
如何使用提供的密码进行身份验证(或拒绝)用户。关键是,您的类不应该公开密码(通过getter),而应该封装密码并公开行为。这是我的首选方法,因为它允许您在不更改API的情况下实现加密密码(而不是明文密码)。嗯,getter/setter确实是一种反模式,但我也认为OO应该是对现实世界建模的,在现实世界中,通常我会将凭证交给某种验证者,他们会查看凭证上打印有我的用户配置文件,然后说,是的,这看起来是合法的。我不知道其他国家是否也是这样