第一步:直接java编译:
import java.util.Scanner;
import java.security.MessageDigest;
import javax.xml.bind.DatatypeConverter;
public class E40_PasswordDigest
{
public static void main( String[] args ) throws Exception
{
Scanner keyboard = new Scanner(System.in);
String pw, hash;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
System.out.print("Password: ");
pw = keyboard.nextLine();
digest.update( pw.getBytes("UTF8") );
hash = DatatypeConverter.printHexBinary( digest.digest() );
System.out.println( hash );
}
}
系统报错:
(package javax.xml.bind is declared in module java.xml.bind, which is not in the module graph)
javac --version
javac 10.0.1
在该版本下:经过确认:不存在该jar包,需要外部引入。
在网上下载jar包并使用带jar包编译方式后:报错信息为SHA-256算法不存在。
javac -cp javax.xml.bind.jar E40_PasswordDigest.java
//可以成功打包
java -cp javax.xml.bind.jar:/Users/abc/javacode E40_PasswordDigest
Exception in thread "main" java.security.NoSuchAlgorithmException: SHA-256 MessageDigest not available
at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
at java.base/java.security.Security.getImpl(Security.java:697)
at java.base/java.security.MessageDigest.getInstance(MessageDigest.java:178)
at E40_PasswordDigest.main(E40_PasswordDigest.java:12)
进一步调研:可以通过以下代码获取目前版本的jdk自带的加密方式:
public static void main( String[] args ) throws Exception
{
TreeSet<String> algorithms = new TreeSet<>();
for (Provider provider : Security.getProviders())
{for (Service service : provider.getServices())
{
if (service.getType().equals("Signature"))
algorithms.add(service.getAlgorithm());
}
}
for (String algorithm : algorithms)
System.out.println(algorithm);
}
run该代码后发现同样缺少import机制;
使用IDEA Shift+Shift后 逐个定位了class的位置:最后的运行结果如下:
import java.util.*;
import java.security.Provider;
import java.security.Provider.Service;
import java.security.Security;
public class tool_get_algo
{
public static void main( String[] args ) throws Exception
{
TreeSet<String> algorithms = new TreeSet<>();
for (Provider provider : Security.getProviders())
{for (Service service : provider.getServices())
{
if (service.getType().equals("Signature"))
algorithms.add(service.getAlgorithm());
}
}
for (String algorithm : algorithms)
System.out.println(algorithm);
}
}
import java.security.MessageDigest;
import java.lang.Exception;
import java.util.Base64;
public class crtpto
{
public static void main(String[] args) {
MessageDigest messageDigest = null;
String algo = "SHA3-384";
String plainText = "AAa";
byte[] hashBytes = null;
try
{
messageDigest = MessageDigest.getInstance(algo);
messageDigest.update( plainText.getBytes() );
hashBytes = messageDigest.digest();
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println( Base64.getEncoder().encodeToString(hashBytes));
}
}
该class获取当前支持的加密方式。
修改SHA-256为SHA256withDSA后依旧无法解决问题
但修改为SHA3-384可以解决
下一个问题是pw.getBytes("UTF8")
经过Stack Overflow;该版本下改为小写的utf8即可解决问题~
参考链接:
https://blog.youkuaiyun.com/u012865381/article/details/52171197