messagedigest在第一个摘要后返回不同的键

u4dcyp6a  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(355)

下面是我初始化messagedigest的方法

private static MessageDigest messageDigest;

    public static final String SALT_DO_NOT_CHANGE = "somesalt";

    static {
        try {
            messageDigest = MessageDigest.getInstance("SHA-512");
            messageDigest.update(SALT_DO_NOT_CHANGE.getBytes());
        } catch (NoSuchAlgorithmException e) {
            LOGGER.error("error for message digest", e);
            throw new RuntimeException("could not initialize message digest");
        }
    }

下面是如何获取密码字节的摘要,我稍后将其转换为字符串(这里没有问题)

byte[] bytes = messageDigest.digest(password.getBytes(StandardCharsets.UTF_8));

现在假设密码是“password@1".
这是第一次输出(很抱歉下面的长文本)
115,83,48,-2,41,29,-99,71,-54,-53,-26,-67,-118,48,-75,77,13,100,42,70,-72,110,-85,23,-38,119,-110,-15,121,3,-25,114,-68,109,-108,94,-122,65,-62,10,-90,8,-125,114,-118,51,-51,89,127,55,37,83,-126,56,-31,-27,-49,-60,25,74,-80,-110,23,45
这是第二次输出。在这之后还是一样的。
-62,-50,45,-44,91,-86,16,90,85,53,101,-122,51,12,-82,52,-123,-101,-10,-28,-108,114,120,-96,84,-23,38,-75,78,67,36,-93,-88,-11,79,76,126,-34,-2,109,76,-31,-30,-86,-28,13,-91,-22,-65,-128,108,-47,15,19,95,60,-30,-123,-4,20,-64,21,-1,7
有人能帮我理解这里发生了什么吗?

dgjrabp2

dgjrabp21#

这个 static 块只在类加载时运行一次(或者更确切地说,初始化,但实际上是在加载时运行)。因此如果你有一个方法 messageDigest.digest(password) 在第一次调用时,它计算 somesaltPassword@1 这是你的第一个值 messageDigest 物体复位;任何后续调用都会计算 Password@1 这是您的第二个值,并再次将其重置。
顺便说一句,使用salt的全部目的和原因是它确实发生了变化,再加上对密码进行一次快速哈希运算(即使使用salt)是不安全的,除非它是一个非常高熵的密码(超过了人类的记忆),但这些都是离题的;搜索security.sx和/或crypto.sx,其中这些问题已得到多次回答和讨论。

相关问题