Spring的PasswordEncoder到底是如何对明文应用salt的?

问题描述 投票:0回答:1

我看过文档,我不知道它是指定的。我也不知道如何深入源代码来学习这一点。这是一个可行的解决方案。

我正处于将用户名/密码数据的中小型数据库从 Spring 框架迁移到 Remix.js 的不幸境地。

最困难的部分似乎是让我的哈希算法正确地对密码加盐。我正要开始做一些烦人的排列,所以我想问一下。

以下是旧哈希值的生成方式:https://github.com/Parrit/Parrit/blob/master/src/main/java/com/parrit/controllers/ProjectController.java#L68

这是一个看起来像什么的例子。明文,这应该是

password

{sha256}{1htkE/1MXKL7uqfqhOC2SI39YzX2lEsd96BqJCHTUCs=}9f62dbe07df8ac7f049cdb1ae1291b02f2d1ea645c7f4df9a1235e93a0f213bd

我的理解是,这是

{alg}{salt}hash

很好,但是当我尝试在 JavaScript 中计算哈希时,我得到了不匹配的结果

const compare_sha256 = (attempt: string, info: PasswordInfo): boolean => {
  let attemptHash;
  if (info.salt) {
    const saltedAttempt = attempt + info.salt;
    console.log("saltedAttempt", saltedAttempt);
    attemptHash = createHash("sha256").update(saltedAttempt).digest("hex");
  } else {
    attemptHash = createHash("sha256").update(attempt).digest("hex");
  }
  console.log({ attemptHash, actuallHash: info.hash });
  return attemptHash === info.hash;
};

日志

saltedAttempt password1htkE/1MXKL7uqfqhOC2SI39YzX2lEsd96BqJCHTUCs=
{
  attemptHash: 'ae192cbdfa2abf7b82bfdeec0168cc0cd7fd359ed49d7494daa88046ef025599',
  actuallHash: '9f62dbe07df8ac7f049cdb1ae1291b02f2d1ea645c7f4df9a1235e93a0f213bd'
}

我认为明文和盐之间必须有一些分隔字符。如果我遗漏了什么,请指出给我。

typescript spring cryptography sha256
1个回答
0
投票

可以使用

MessageDigestPasswordEncoder
重现哈希值。密码和盐按此顺序连接。必须使用盐,包括大括号和 base64 编码:

var crypto = require('crypto')
var hash = crypto.createHash('sha256')
    .update('password')
    .update('{1htkE/1MXKL7uqfqhOC2SI39YzX2lEsd96BqJCHTUCs=}')
    .digest("hex")
console.log(hash) // 9f62dbe07df8ac7f049cdb1ae1291b02f2d1ea645c7f4df9a1235e93a0f213bd
© www.soinside.com 2019 - 2024. All rights reserved.