我需要为存储在数据库中的密码进行哈希。如何在Java中实现?
我希望将明文密码与随机盐相结合,然后将盐和哈希密码存储在数据库中。
然后,当用户想要登录时,我可以获取他们提交的密码,添加他们帐户信息中的随机盐,对其进行哈希,并查看它是否等于存储在他们帐户信息中的哈希密码。
我希望将明文密码与随机盐相结合,然后将盐和哈希密码存储在数据库中。
然后,当用户想要登录时,我可以获取他们提交的密码,添加他们帐户信息中的随机盐,对其进行哈希,并查看它是否等于存储在他们帐户信息中的哈希密码。
在所有标准哈希方案中,LDAP ssha 是最安全的一种。
http://www.openldap.org/faq/data/cache/347.html
我只需按照指定的算法,并使用MessageDigest进行哈希处理。
您需要像您建议的那样将盐存储在数据库中。
PasswordHasher
类:import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;
public class PasswordHasher {
private static final String ALGO = "PBKDF2WithHmacSHA1";
private static final byte[] SALT = {
8, 8, 8, 8, 2,
8, 7, 7, 7, 2,
1, 1, 1, 1, 2,
11
};
private static final int ITERATION_COUNT = 1000;
private static final int KEY_LENGTH = 128;
private SecretKeyFactory mFactory;
byte[] hashPassword(String password) {
SecretKeyFactory factory = getFactory();
if (factory != null) {
try {
KeySpec spec = new PBEKeySpec(password.toCharArray(), SALT, ITERATION_COUNT, KEY_LENGTH);
return factory.generateSecret(spec).getEncoded();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
}
return null;
}
boolean verifyPassword(String password, byte[] expectedHashResult) {
byte[] hashedPassword = hashPassword(password);
if (hashedPassword == null) {
// Log fail result
return false;
}
return Arrays.equals(hashedPassword, expectedHashResult);
}
private SecretKeyFactory getFactory() {
if (mFactory == null) {
try {
mFactory = SecretKeyFactory.getInstance(ALGO);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return mFactory;
}
}
我从Udemy的视频中学到了这个,并进行了编辑,使其成为更强的随机密码。
}
private String pass() {
String passswet="1234567890zxcvbbnmasdfghjklop[iuytrtewq@#$%^&*" ;
char icon1;
char[] t=new char[20];
int rand1=(int)(Math.random()*6)+38;//to make a random within the range of special characters
icon1=passswet.charAt(rand1);//will produce char with a special character
int i=0;
while( i <11) {
int rand=(int)(Math.random()*passswet.length());
//notice (int) as the original value of Math>random() is double
t[i] =passswet.charAt(rand);
i++;
t[10]=icon1;
//to replace the specified item with icon1
}
return new String(t);
}
}
import java.security.MessageDigest;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Base64;
import java.util.Properties;
public class Main{
public static void main(String[]a]{
//enter code here
}
public static String hashPassword(String password) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] hash = md.digest(password.getBytes());
return Base64.getEncoder().encodeToString(hash);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
hashPassword是一个方法,当我们将一个字符串作为它的参数传递时,它会返回一个哈希值。 MessageDigest是提供散列密码接口的类。 getInstance用于获取散列算法的实例,例如MD-5、SHA 216、SHA-512等。 哈希字符串以-byte []形式呈现。 在返回语句中,我们使用ToString方法将字节转换为字符串。