我有两个类“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对象。有任何想法吗??
答案 0 :(得分:7)
答案 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中的反模式。