野花太放肆 2024-11-12 04:00 采纳率: 33.3%
浏览 24

Java中MessageDigest类在jar包和开发环境下MD5加密结果不同

img

java8中的这段MD5加密代码,在打了springboot jar包idea开发环境中得到的加密值不一样。
我也用了其他工具包,类似hutool,guava,apache
发现在idea本地和打了jar包,加密结果都是一样的,唯独使用java.security包下的MessageDigest类加密,会出现打了jar和正常开发过程中结果不一致的情况。
对此,我对比打印了类加载器,发现都是Bootstrap加载器;

img

也打印了包的来源。都是SUN公司的包;

img

jar包的运行环境和本地开发环境一致,没有任何时区上的差异,没有jdk环境差异。
无奈最后只能用第三方工具包加密来完成业务
但确实很疑惑,请教下大家是否也遇到过相同的情况,或是有无精通java原生类源码的朋友,可以给出排查方向或者问题根本原因,谢谢了。

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-11-12 04:01
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的信息,我理解您在使用Java的MessageDigest类进行MD5加密时,发现在开发环境和打包成jar后的运行环境中得到的加密结果不一致。首先,我会提供一些可能导致这种情况的常见原因和建议的排查方向,希望能帮助您找到问题的根源。

    1. 依赖版本问题:尽管您提到使用的JDK环境相同,但是可能存在某些依赖库或框架的版本差异。确保在打包时使用的所有依赖库和框架与本地开发环境中的版本完全一致。
    2. 编码问题s.getBytes()默认使用系统的默认字符集进行编码。如果在不同的环境中系统默认字符集不同,可能会导致加密结果不同。尝试显式指定编码格式,如s.getBytes("UTF-8")
    3. 类加载器问题:虽然您提到类加载器都是Bootstrap加载器,但请确保在打包的jar和运行环境中,MessageDigest类的加载路径和版本确实相同。可以考虑深入调查类加载的细节。
    4. JVM参数差异:尽管您提到运行环境没有差异,但请确保JVM启动时使用的参数在两个环境中完全相同。某些JVM参数可能会影响加密的结果。
    5. 环境问题:虽然您认为环境相同,但仍有可能存在微妙的差异。例如,操作系统的某些设置、环境变量等可能影响到加密结果。尝试记录并比较两个环境中的所有相关设置和变量。
    6. 源码层面:如果上述方法都不能解决问题,您可以尝试深入研究MessageDigest的源码,看看是否有任何可能导致差异的地方。但这通常需要深入理解Java源码和加密原理。

    建议的排查步骤:

    1. 比较两个环境中的所有依赖版本,确保完全一致。
    2. 显式指定字符串编码进行加密,如使用s.getBytes("UTF-8")
    3. 深入调查类加载的细节,确保MessageDigest类的加载路径和版本在两个环境中相同。
    4. 比较两个环境中的JVM启动参数。
    5. 仔细检查所有环境设置和变量,确保没有微妙的差异。
    6. 如果仍然存在问题,可以考虑深入研究MessageDigest的源码。

    希望这些建议能帮助您找到问题的根源。如果您有任何其他疑问或需要进一步的帮助,请随时提问。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月12日