Я пытаюсь защитить пароли веб-приложения, которое я создаю. Я довольно новичок в криптографии. Я использую 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
Релевантно: http: //security.stackexchange.com/questions/51959/why-are-salted-hashes-more-secure – immibis
Также у вас есть как минимум два разных вопроса: «Если кто-то украдет мою базу данных солями, они могут прочитать пароли?» (возможно, лучше подходит для security.se) и «Должен ли я добавить новый столбец или сохранить две вещи в одном столбце, разделенные символом' | '?" – immibis