Learn Java the hard way 第40章 无法正确compile问题

本文详细解析了在Java中使用SHA-256进行密码加密时遇到的问题及解决方案,包括处理缺失的算法、调整编码方式,并提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:直接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("UTF­8") );
			   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("UTF­8")

经过Stack Overflow;该版本下改为小写的utf8即可解决问题~

 

参考链接:

https://stackoverflow.com/questions/48040299/java-security-nosuchalgorithmexception-sha3-384-messagedigest-not-available-w

http://www.itkeyword.com/doc/2396767879992050x366/java-security-nosuchalgorithmexception-rsa-signature-not-available

 

https://blog.youkuaiyun.com/u012865381/article/details/52171197

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值