参考Python的一个类库使用JAVA进行了实现,直接上代码
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import java.util.Random;
public class SSHA512Util {
private static byte[] addBytes(byte[] data1, byte[] data2) {
byte[] data3 = new byte[data1.length + data2.length];
System.arraycopy(data1, 0, data3, 0, data1.length);
System.arraycopy(data2, 0, data3, data1.length, data2.length);
return data3;
}
public static String getSSHA1512Local(String inputStr){
StringBuilder str=new StringBuilder();//定义变长字符串
Random random=new Random();
//随机生成数字,并添加到字符串
for(int i=0;i<8;i++){
str.append(random.nextInt(10));
}
//将字符串转换为数字并输出
int num=Integer.parseInt(str.toString());
System.out.println(num);
byte[] password = inputStr.getBytes();
byte[] salt = str.toString().getBytes();
try {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
digest.reset();
digest.update(password);
digest.update(salt);
byte[] hashed = digest.digest();
byte[] data = addBytes(hashed, salt);
String encodedHash = Base64.getEncoder().encodeToString(data);
return "{SSHA512}" + encodedHash;
}
catch (NoSuchAlgorithmException e)
{
return null;
}
}
public static boolean verifySSHA512local(String plainText, String sshaText)
{
if(sshaText.startsWith("{SSHA512}") || sshaText.startsWith("{ssh512}"))
{
sshaText = sshaText.substring(9);
}
else
{
return false;
}
byte[] challengePasswordByte = Base64.getDecoder().decode(sshaText);
if(challengePasswordByte.length <= 64)
{
return false;
}
byte[] encrptByte = new byte[64];
byte[] saltByte = new byte[8];
System.arraycopy(challengePasswordByte, 0, encrptByte, 0, 64);
System.arraycopy(challengePasswordByte, 64, saltByte, 0, 8);
try {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
digest.reset();
digest.update(plainText.getBytes());
digest.update(saltByte);
byte[] hashed = digest.digest();
if(Arrays.equals(hashed, encrptByte))
{
return true;
}
else
{
return false;
}
}
catch (NoSuchAlgorithmException e)
{
return false;
}
}
public static void main(String[] argc)
{
String password = "123456";
String encodePassword = getSSHA1512Local(password);
boolean boolVerify = verifySSHA512local("123456", encodePassword);
System.out.println(boolVerify);
}
}