在类中保存密码最理想的方法-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应该是对现实世界建模的,在现实世界中,通常我会将凭证交给某种验证者,他们会查看凭证上打印有我的用户配置文件,然后说,是的,这看起来是合法的。我不知道其他国家是否也是这样