java - MessageDigestMessage Digest 在第一次摘要后返回不同的键
问题描述
这是我初始化 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
有人可以帮我理解这里发生了什么吗?
解决方案
该static
块仅在加载类时运行一次(或更准确地说,初始化,但实际上在加载时发生)。因此,如果您有一个在第一次调用时执行的方法,它会计算您的第一个值messageDigest.digest(password)
的字节的摘要,并让对象重置;任何后续调用都会计算第二个值的字节摘要,并再次将其重置。somesaltPassword@1
messageDigest
Password@1
顺便说一句,使用盐的全部目的和原因是它确实会改变,而且对密码进行单个快速散列(即使使用盐)是不安全的,除非它是一个非常高熵的密码(比人类记忆的要多),但是这些与 SO 无关;搜索 security.SX 和/或 crypto.SX,这些都已被多次回答和讨论。
推荐阅读
- google-chrome - “广泛的主机权限” webstore chrome 扩展发布错误
- android - 指定 SQLite 数据库名称时,句点是否重要?
- php - php preg_split 成数组
- python - 如何在 python 中使用多标签分类器对文本进行分类?
- imagemagick - 自动旋转和缩放肖像的脚本
- python - DJANGO custom user model error 'str' object has no attribute 'objects'
- java - [Spring-Boot]Controller 需要一个无法找到的名为“entityManagerFactory”
- c# - 在事件处理期间具有递归和修改的高效调用列表
- reactjs - Jest can't test React state
- java - 可以在其内部静态存储 Activity 上下文和 Activity Reference 吗?