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对象.有任何想法吗??
有人知道一种安全的方法,或者最好是一种人们用来解决这种情况的模式吗?
你需要问自己"对抗什么?".
当然,如果在与此类相同的JVM中执行某些不受信任的代码,则可以获取密码.但为什么你会允许这种情况发生?
您无法在同一JVM中使用具有完全权限的不受信任代码保护内存中数据.
如果您小心,可以保护数据免受安全沙箱中运行的不受信任的代码的影响; 例如,通过创建自定义a Permission
并使用SecurityManager
来检查(比方说)getPassword
方法的调用者是否具有所需的权限.(你还需要做其他一些事情......)
话虽如此,处理密码的"最佳实践"方法是使用(真正的)安全散列算法创建和存储种子散列.你可以在这里做同样的事情.问题在于,如果你确实需要明确的密码,那将无法正常工作......因为哈希的整个想法是让恢复密码变得不可行.但另一方面,如果密码一目了然,坏人可能会抓住它.
存储加密的密码对于JVM中的不受信任的代码是不安全的.给定时间,精力以及不信任与坏人之间的隐蔽信息通道,应该可以恢复所使用的密钥和算法,从而解密数据.坏人可能通过核心转储或通过读取JVM进程的页面文件来获取信息.
最重要的是,如果您的平台安全性被破坏(JVM或操作系统),您无法保证以明文或加密方式保存的密码将保持安全.
改用“对象思维”。您当前的设计根本不是 OOP。您应该公开配置文件的行为,而不是设置和获取密码。例如:
interface Profile {
void rename(String name);
String identity();
boolean authenticate(char[] password)
}
Run Code Online (Sandbox Code Playgroud)
Getters/setters 是 OOP 中的一种反模式。