Java 为什么数据库中的日期永远不会与新日期()的格式相同?
基本上,我的目标是使用日期作为salt密钥来加密我的密码。我用的是SHA-512。当我加密密码时,我会捕获今天的日期,比如varDate,它是Java 为什么数据库中的日期永远不会与新日期()的格式相同?,java,Java,基本上,我的目标是使用日期作为salt密钥来加密我的密码。我用的是SHA-512。当我加密密码时,我会捕获今天的日期,比如varDate,它是java.util.date类型,然后进行加密。如果我通过执行以下操作来输出它varDate.toString(),我将看到2013年7月18日星期四17:37:27 SGT。然后在此之后,varDate将被存储到数据库中 在解密时,我将提供我的密码,并从数据库中查询varDate,它也在java.util.Date中键入,加密它并进行比较。有趣的是,这总
java.util.date
类型,然后进行加密。如果我通过执行以下操作来输出它varDate.toString()
,我将看到2013年7月18日星期四17:37:27 SGT
。然后在此之后,varDate
将被存储到数据库中
在解密时,我将提供我的密码,并从数据库中查询varDate
,它也在java.util.Date
中键入,加密它并进行比较。有趣的是,这总是会失败,因为加密的值永远不会匹配。我发现当我从DB输出varDate
时,它的格式是2013-07-18 17:37:27.0
我是如此惊讶,如此好奇和挣扎,为什么会发生这种事?我想知道这是否是导致加密失败的根本原因
更新日期:23-07-2013
这是为了说明代码如何在我的哈希算法上工作。我有一个函数,它接受密码作为字符串,接受salt密钥作为字符串,然后对密码进行如下哈希运算:
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.reset();
md.update(saltKey.getBytes());
md.digest(password.getBytes("UTF-8"));
我的实验表明,通过传入Date对象,我无法得到一致的结果。但如果我将其重新格式化为字符串,那么只有我才能得到一致的结果。在我看来,date对象不是一个好的salt键候选对象。您不应该使用
date.toString()
。它的输出取决于日期的实际具体类型,可以是java.util.date
(大概是第一种情况),java.sql.Timestamp
(大概是第二种情况)或java.sql.date
。它还取决于当前时区
我的建议是完全忘记用枣做盐。使用SecureRandom生成随机盐,并将此盐存储在数据库中
如果您确实坚持使用日期,那么使用可靠的机制将其转换为字符串,例如带有固定模式和UTC时区的
SimpleDataFormat
。您不应该使用Date.toString()
。它的输出取决于日期的实际具体类型,可以是java.util.date
(大概是第一种情况),java.sql.Timestamp
(大概是第二种情况)或java.sql.date
。它还取决于当前时区
我的建议是完全忘记用枣做盐。使用SecureRandom生成随机盐,并将此盐存储在数据库中
如果您确实坚持使用日期,则使用可靠的机制将其转换为字符串,例如使用固定模式和UTC时区的
SimpleDateFormat
。始终格式化日期,使用显式格式将日期从日期/时间类型转换为字符串。这样,您将始终得到您想要的,并且您将不依赖系统默认格式(用户可以更改和重新配置)。始终格式化日期,使用显式格式将日期/时间类型转换为字符串。这样,您将始终得到您想要的,并且您不会依赖于系统默认格式(用户可以更改和重新配置)。旁注:您正在对密码进行哈希运算,而不是加密。对不起,我的错,我正在哈希运算。您能展示一下如何将日期用作salt吗?你如何恢复盐?旁注:你在对密码进行哈希运算,而不是加密。对不起,我的错,我在哈希运算。你能告诉我你是如何使用日期作为盐的吗?那么如何恢复salt呢?如果我使用SecureRandom生成一个随机salt,我可以知道我可以将salt密钥存储在KeyStore或JKS文件中吗?你说的是哪个salt密钥?为每个用户生成一个随机salt,并将salt存储在用户行中,紧挨着登录名和哈希密码。没有涉及密钥。我正要改变我的设计,我使用常量salt密钥(从SecureRandom生成)存储到一个文件中,这是一个密钥库文件。salt密钥与登录密码一起用于散列。如果我使用SecureRandom生成随机salt,我可以知道我可以将salt密钥存储在密钥库或JKS文件中吗?你说的是哪一个salt密钥?为每个用户生成一个随机salt,并将salt存储在用户行中,紧挨着登录名和哈希密码。没有涉及密钥。我正要改变我的设计,我使用常量salt密钥(从SecureRandom生成)存储到一个文件中,这是一个密钥库文件。salt密钥与登录密码一起用于哈希。