Java中的MessageDigest NoSuchAlgorithmException

Java中的MessageDigest NoSuchAlgorithmException,java,spring,eclipse,rest,Java,Spring,Eclipse,Rest,因此,我浏览了几个Stackoverflow线程和其他网站,同时试图找到解决方案 我正在做一项学校作业,要求使用MessageDigest实例 我将在下面粘贴我的代码,但我尝试过getInstance(“SHA-256”)和getInstance(“SHA-1”)以及getInstance(“MD5”)都有相同的错误 我还尝试添加带有“SUN”的provider参数,但随后我得到了一个 没有这样的例外 我的学校指令要求导入java.security.MessageDigest 我也尝试过导入ja

因此,我浏览了几个Stackoverflow线程和其他网站,同时试图找到解决方案

我正在做一项学校作业,要求使用MessageDigest实例

我将在下面粘贴我的代码,但我尝试过getInstance(“SHA-256”)和getInstance(“SHA-1”)以及getInstance(“MD5”)都有相同的错误

我还尝试添加带有“SUN”的provider参数,但随后我得到了一个

没有这样的例外

我的学校指令要求导入java.security.MessageDigest

我也尝试过导入java.security.,以防丢失一些东西

我试图得到一个提供者列表,但这并没有给我任何东西,它甚至无法编译

我已按照在上找到的“尝试/捕获”说明进行操作。还是没什么

我不知道下一步该去哪里,而且似乎没有一个网站对此有可靠的答案

根据Oracle的说法,这个过程应该在提供者之间循环,直到找到一个支持您选择的算法为止。我已经尝试了他们列表中的所有三种算法

我知道这可能是我忽略的一件非常简单的事情,但我似乎无法把它弄清楚。任何帮助都将不胜感激。代码如下

-乔恩

代码:

package com.snhu.sslserver;
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
导入java.security.MessageDigest;
导入java.util.Scanner;
@SpringBoot应用程序
公共类服务器应用程序{
公共静态void main(字符串[]args){
run(ServerApplication.class,args);
}
}
@RestController
类服务器控制器{
//创建消息摘要的实例
MessageDigest md=MessageDigest.getInstance(“SHA-256”);
//FIXME:添加哈希函数以返回应包含您的姓名的数据字符串的校验和值。
@请求映射(“/hash”)
公共字符串myHash(){
String data=“你好,乔·史密斯!”;
返回“数据:”+数据;
}
}
独立使用问题 MessageDigest实例不是线程安全的。 没有螺纹安全保证

请不要像这样使用MessageDigest实例(除非您的控制器在请求范围内)

假设
  • 线程池由服务器使用
  • 我们的期望是减少MessageDigest对象创建的开销
  • 可能的解决办法
  • 创建
    MessageDigest
  • 使用此
    ThreadLocal
    实例计算摘要
  • 希望未来的
    Fiber
    s会尊重这种使用方式(如果不是,我们在java生态系统中有更大的问题)
  • 暗示 在动态创建/销毁线程的情况下,创建MessageDigest的开销仍然很大:

  • 管理单独的executor服务(使用threadpool),并使用futures管理摘要
  • 或者为每个请求创建新的MessageDigest实例(以避免不必要的线程本地开销)

  • 这是否回答了您的问题?只有显式构造函数才能抛出,您需要定义
    public ServerController()抛出NoSuchAlgorithmException{this.md=MessageDigest.getInstance(“SHA-256”);}
    并删除字段初始值设定项:
    private MessageDigest md;
    。谢谢@PiotrP.Karwasz,我现在就试试。@jon,请检查下面的答案。它不是线程-safe@Horse,谢谢!我刚查过,现在正在处理你的推荐。我真的很感谢你的帮助!谢谢你的马!我真的很感谢你详细的回答。很高兴能帮上忙
    package com.snhu.sslserver;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.security.MessageDigest;
    import java.util.Scanner;
    
    @SpringBootApplication
    public class ServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServerApplication.class, args);
        }
    
    }
    
    @RestController
    class ServerController{
        
        //create instance of message digest
        MessageDigest md = MessageDigest.getInstance("SHA-256");
    //FIXME:  Add hash function to return the checksum value for the data string that should contain your name.    
        @RequestMapping("/hash")
        public String myHash(){
            String data = "Hello Joe Smith!";
           
            return "<p>data:"+data;
        }
    }