Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么数据库中的日期永远不会与新日期()的格式相同?_Java - Fatal编程技术网

Java 为什么数据库中的日期永远不会与新日期()的格式相同?

Java 为什么数据库中的日期永远不会与新日期()的格式相同?,java,Java,基本上,我的目标是使用日期作为salt密钥来加密我的密码。我用的是SHA-512。当我加密密码时,我会捕获今天的日期,比如varDate,它是java.util.date类型,然后进行加密。如果我通过执行以下操作来输出它varDate.toString(),我将看到2013年7月18日星期四17:37:27 SGT。然后在此之后,varDate将被存储到数据库中 在解密时,我将提供我的密码,并从数据库中查询varDate,它也在java.util.Date中键入,加密它并进行比较。有趣的是,这总

基本上,我的目标是使用日期作为salt密钥来加密我的密码。我用的是SHA-512。当我加密密码时,我会捕获今天的日期,比如varDate,它是
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密钥与登录密码一起用于哈希。