【问题标题】:MessageDigest NoSuchAlgorithmException in JavaJava 中的 MessageDigest NoSuchAlgorithmException
【发布时间】:2021-05-07 03:13:17
【问题描述】:

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

我正在处理一项需要使用 MessageDigest 实例的学校作业。

我将在下面粘贴我的代码,但我尝试过 getInstance("SHA-256") 和 getInstance("SHA-1") 和 getInstance("MD5") 都出现相同的错误。

我也尝试使用“SUN”添加提供程序参数,但随后我得到了一个

NoSuchProviderException。

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

我已经尝试过,以及import java.security.*,以防万一丢失。

我试图获取提供者的列表,但这并没有给我任何东西,甚至无法编译。

我已按照this site 中的 try/catch 说明进行操作。还是什么都没有。

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

根据 Oracle 的说法,该流程应该在提供者之间循环,直到找到一个支持您选择的任何算法的提供者,并且我已经尝试了他们列表中的所有三个 source

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

-乔恩

代码:

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;
    }
}

【问题讨论】:

  • 这能回答你的问题吗? MessageDigest NoSuchAlgorithmException
  • 只有显式构造函数才能抛出,需要定义public ServerController() throws NoSuchAlgorithmException { this.md = MessageDigest.getInstance("SHA-256"); }并删除字段初始化器:private MessageDigest md;
  • 谢谢@PiotrP.Karwasz,我现在就试试。
  • @jon,请检查下面的答案。它不是线程安全的
  • @Horse,谢谢!我刚刚检查过了,现在正在处理你的建议。非常感谢您的帮助!

标签: java spring eclipse rest


【解决方案1】:

独立使用问题

MessageDigest 实例不是线程安全的。 doc 中没有线程安全保证

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

假设

  1. 服务器使用线程池
  2. 期望是减少 MessageDigest 对象创建的开销

可能的解决方案

  1. 创建ThreadLocalMessageDigest 实例
  2. 使用此ThreadLocal 实例计算摘要
  3. 希望未来Fibers 会尊重这种使用方式(如果没有,我们在 java 生态系统中会遇到更大的问题)

建议

在动态创建/销毁线程的情况下,创建 MessageDigest 的开销仍然很大:

  1. 管理单独的执行器服务(使用线程池),并使用期货管理摘要
  2. 或为每个请求创建新的 MessageDigest 实例(以避免不必要的 ThreadLocal 开销。

【讨论】:

  • 谢谢马!非常感谢详细的回复。
  • 很高兴能帮上忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多