0

基本上我的目标是使用日期作为盐密钥来加密我的密码。我正在使用 SHA-512 来执行此操作。当我加密我的密码时,我会捕获今天的日期,比如 varDate,它是一种java.util.Date类型,然后进行加密。如果我这样做输出它varDate.toString(),我会看到Thu Jul 18 17:37:27 SGT 2013。然后在此之后varDate将存储到数据库中。

解密时,我将提供我的密码并varDate从数据库中查询,这也是java.util.Date类型,加密并进行比较。有趣的是,这总是会失败,因为加密的值永远不会匹配。我发现当我输出varDate来自 DB 的2013-07-18 17:37:27.0.

我是如此惊讶,如此好奇和挣扎,为什么会发生这种情况?我想知道这是否是导致加密失败的根本原因?

2013 年 7 月 23 日更新

这是为了说明代码如何在我的哈希算法上工作。我有一个函数接受密码作为字符串,盐键作为字符串,然后像这样对密码进行散列:

   MessageDigest md = MessageDigest.getInstance("SHA-512");
   md.reset();
   md.update(saltKey.getBytes());
   md.digest(password.getBytes("UTF-8"));

我的实验表明,通过传入 Date 对象,我无法得到一致的结果。但是,如果我将其重新格式化为字符串,那么只有我会得到一致的结果。在我看来,日期对象不是一个好的盐键候选者。

4

2 回答 2

2

你不应该使用Date.toString(). 它的输出取决于日期的实际具体类型,可能是java.util.Date(你的第一种情况,大概),java.sql.Timestamp(大概是您的第二种情况)或java.sql.Date. 它还取决于当前时区。

我的建议是完全忘记使用日期作为盐。使用 SecureRandom 生成随机盐,并将此盐存储在数据库中。

如果您真的坚持使用日期,那么使用可靠的机制将其转换为字符串,例如SimpleDateFormat具有固定模式和 UTC 时区的 a。

于 2013-07-18T13:49:11.797 回答
1

始终格式化您的日期,使用显式格式将它们从日期/时间类型转换为字符串。这样你总能得到你想要的,并且你不会依赖系统默认格式(用户可以更改和重新配置)。

于 2013-07-18T16:37:46.303 回答