- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个使用自定义系统类加载器的应用程序,由 Djava.system.class.loader=class
参数设置。该应用程序使用 RMI。在 eclipse 中一切正常,但是如果我导出一个可运行的 jar,就会发生这个错误:
Caused by: java.lang.SecurityException: SHA MessageDigest not available
at sun.rmi.server.Util.computeMethodHash(Unknown Source)
at sun.rmi.server.UnicastServerRef$HashToMethod_Maps.computeValue(Unknown Source)
at sun.rmi.server.UnicastServerRef$HashToMethod_Maps.computeValue(Unknown Source)
at sun.rmi.server.WeakClassHashMap.get(Unknown Source)
at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
at sun.rmi.registry.RegistryImpl.setup(Unknown Source)
at sun.rmi.registry.RegistryImpl.<init>(Unknown Source)
at java.rmi.registry.LocateRegistry.createRegistry(Unknown Source)
我很自然地试图解决这个问题,并写了一个简单的 MessageDigest md = MessageDigest.getInstance("SHA");
作为我的 main.xml 文件的第一行。基本上是一样的。确切的错误是:
java.security.NoSuchAlgorithmException: SHA MessageDigest not available
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at java.security.Security.getImpl(Unknown Source)
at java.security.MessageDigest.getInstance(Unknown Source)
然后我尝试使用一个简单的 ClassLoader 作为 SystemClassloader。现在看起来像这样:
public class RootClassLoader extends ClassLoader{
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
return super.loadClass(name);
}
public RootClassLoader(ClassLoader loader){
super(loader);
}
}
还是一样。如果我将这个场景重建为一个新项目,一切都会按预期进行,所以显然还有其他东西坏了,但现在我不知道是什么。
我在程序的任何地方都没有使用安全管理器,我使用的是 oracle 的标准 jre7。
有什么我可能忽略的吗?
更新:即使我根本不重写 loadClass
方法,也会发生错误......它似乎失败只是因为有一个非标准的系统类加载器,不管它实际做了什么
更新 2:我列出了所有可用的安全提供程序/算法。当我在 eclipse 中执行代码时(仍然使用自定义类加载器),一切似乎都井井有条,但是在执行可运行的 jar 时,完整的 SUN version 1.7
Provider 似乎丢失了。没有自定义类加载器,一切都是一样的。在仅包含上述场景(并且有效)的环境中,一切看起来都一样,并且每个星座都有 SUN version 1.7
Provider。
更新 3:-verbose:class
显示包 sun.security.provider
等未加载。我不知道为什么,因为这两种选择都是从缺少包的来源 jsse.jar
加载类,并且都打印 [Opened C:\Program Files\Java\jre7\lib\jsse.jar]
(更新 4:实际上它确实被加载了。就在很久之后。甚至 sun.security.provider.SHA
都被加载到两个变体中。这更奇怪)
最佳答案
我找到了这个问题的根源。我不知道为什么以及如何发生这种情况,但似乎我使用的第 3 方库是罪魁祸首。当我删除 lib 时,一切正常。同样,我不知道这怎么可能
关于java - 自定义系统类加载器和 MessageDigest 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18334751/
我有一个 Java 方法,我正在将其移植到 C#,该方法使用盐对字符串进行哈希处理。该方法执行如下操作。 private byte[] hash(byte[] bytes, byte[] salt)
我想使用 MessageDigest 获取 MD5 哈希值,但出现错误。 import java.security.MessageDigest; public class dn { public
我在项目中使用 MessageDigest 计算 md5 签名,但在性能测试期间它抛出 ArrayIndexOutOfBoundsException。 我发现一些帖子表明这是因为 MessageDig
我正在使用 Java 的 MessageDigest 来做一个哈希项目。我想与随机生成的字符串产生的哈希值产生冲突。我已经验证我的字符串确实是随机的。然而,当我输出摘要时,由于某种原因,它总是以“[B
示例一: FileInputStream fis = new FileInputStream(path); MessageDigest digest = MessageDigest.getInstan
我无法让 MessageDigest 工作,程序给我两个错误:不支持的编码异常,NoSuchAlgorithmException byte[] bytesOfchat_key = "lol".get
我有这个在 Java 中加密密码的函数,但是当我调用MessageDigest,即使我使用相同的密码调用它,它每次都会返回不同的结果。我想知道我是否以某种方式将其初始化错误。 public Strin
我遇到了 MessageDigest 在不同计算机上返回不同哈希值的问题。 一台计算机在 Windows Vista 上运行 32 位 Java,另一台在 Mac OS 上运行 64 位 Java。我
我盲目地遵循了 OWASP 关于在 java 中生成哈希的建议 (see here),我不确定我是否正确地做到了。具体来说,我不确定MessageDigest.reset() 的目的和效果。 ,因此何
MessageDigest 类实现了 SHA-1 算法(以及许多其他算法)。 SHA-1 算法允许使用不同的“种子”或初始摘要。参见 SHA-1 Psuedocode 算法初始化变量,或种子: Ini
我自己编写了简化的 MessageDigest 包装器,现在我想知道它是否是线程安全的。 public final class SimpleIMD implements ImmutableMessag
我有一个自定义类加载器,在它的构造函数中我有以下行。 MessageDigest.getInstance("MD5") 当我使用自定义类加载器作为系统类加载器运行示例主应用程序时,出现以下错误。 Er
我非常无聊,所以我正在制作一个实验性的暴力破解器。不过,我在使用 MD5 时遇到了一些问题。我得到两个截然不同的输出, 1aabac6d068eef6a7bad3fdf50a05cc8 -7d881f
MessageDigest 接受一个字符串,表示您要散列时要使用的算法。 I've used some of the code here在我的 Android 设备上积累相当大的 220 个“算法”列
是否有可能保存 MessageDigest 对象的内部状态?我想将它保存在数据库中,所以只能使用原始数据,如 String、int、byte[]。 我想要实现的是能够接收一个碎片文件(在很长一段时间内
我正在尝试使用 Java 中的 MessageDigest 获取字符串的哈希值,但每次的值都不同。当我运行该程序两次时,它会再次得到完全不同的答案。 MessageDigest md
我脑后的某些东西告诉我,我在这里遗漏了一些明显的东西。 我正在将一个现有的 java 项目与第三方 api 集成,该 api 使用 api key 的 md5 哈希进行身份验证。它对我不起作用,在调试
MessageDigest 中的 digest() 方法不应该总是为相同的输入提供相同的哈希值吗? 我试过了,每次我都得到相同输入的不同哈希值集 md5 = MessageDigest.getInst
我有一个使用自定义系统类加载器的应用程序,由 Djava.system.class.loader=class 参数设置。该应用程序使用 RMI。在 eclipse 中一切正常,但是如果我导出一个可运行
我在使用 BouncyCaSTLe 1.59 进行签名/veryfing CADES 签名时遇到问题。我必须添加 messageDigest 属性,但是当我添加它时,我的程序失败了。 这是我的代码:
我是一名优秀的程序员,十分优秀!