我试图证实我正在构建的Web应用程序的密码。我对密码学相当陌生。我正在使用Java和Sha-1 Hash来将密码存储在Db中。保护密码SHA-1 Java
经过一些关于使用盐的问题的研究似乎是散列密码的最佳方式,但当然盐必须与密码一起存储。
在我的情况下,我在盐的数据库中使用了一个新列,我不知道这是否是正确的方法。如果有人窃取我的数据库,用哈希和盐将能够读取密码?将哈希和盐之间的分隔符放在一起并存储在一起会更好吗?在这种情况下,为了检查密码的有效性,我必须解析字符串。 只是我想知道您的意见和最佳实践,可以在这里适用。
非常感谢您提前!
@Entity
@Table(name="USERS")
public class User implements BasePersistentEntity<Long> {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@Column(name="EMAIL",nullable=false,length=50,insertable=true,updatable=true)
private String email;
@Column(name="PASSWORD",nullable=false,length=40,insertable=true,updatable=true)
private String password;
@Column(name="SALT",nullable=false,length=40,insertable=true,updatable=true)
private String passwordSalt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email=email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
if (password.equals(this.password))
{
return;
}
if (passwordSalt == null || passwordSalt.equals(""))
{
passwordSalt = RandomStringUtils.randomAscii(20);
}
this.password = DigestUtils.sha1Hex(password + passwordSalt);
}
/**
* Check if a given password is correct.
*
* @param givenPassword
* @return True is correct, else false.
*/
public boolean checkPassword(String givenPassword)
{
return (password.equals(DigestUtils.sha1Hex(givenPassword + passwordSalt)));
}
public String getPasswordSalt() {
return passwordSalt;
}
public void setPasswordSalt(String passwordSalt) {
this.passwordSalt = passwordSalt;
}
}
SHA1不安全。使用scrypt或bcrypt或PBKDFv2。 – SLaks 2015-02-09 22:32:21
相关:http://security.stackexchange。com/questions/51959/why-are-salted-hashes-more-secure – immibis 2015-02-09 22:33:05
另外,这里至少有两个不同的问题 - “如果有人用盐去偷我的数据库,他们可以读密码吗?” (可能更适合security.se)和“我应该添加一个新的列,还是将两个东西存储在由'|'分隔的一列中?” – immibis 2015-02-09 22:34:22