Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 使用SHA-512和salt散列MD5散列密码?_Java_Security_Hash_Sha - Fatal编程技术网

Java 使用SHA-512和salt散列MD5散列密码?

Java 使用SHA-512和salt散列MD5散列密码?,java,security,hash,sha,Java,Security,Hash,Sha,我正在使用MD5(无盐)散列用户密码的系统上工作。我想使用SHA-512和salt更安全地存储密码 虽然这对于将来的密码很容易实现,但我还想改进现有的MD5哈希密码,最好不要强迫所有用户更改他们的密码。我的想法是只使用SHA-512和适当的salt来散列现有的MD5散列。然后,我可以在数据库中设置一些标志,指示哪些密码是从纯文本散列出来的,哪些密码是从MD5散列出来的。或者,我可以在验证用户时同时尝试这两种方法。或者甚至只是用MD5和SHA-512/salt散列新密码,这样它们就可以像旧密码一样

我正在使用MD5(无盐)散列用户密码的系统上工作。我想使用SHA-512和salt更安全地存储密码

虽然这对于将来的密码很容易实现,但我还想改进现有的MD5哈希密码,最好不要强迫所有用户更改他们的密码。我的想法是只使用SHA-512和适当的salt来散列现有的MD5散列。然后,我可以在数据库中设置一些标志,指示哪些密码是从纯文本散列出来的,哪些密码是从MD5散列出来的。或者,我可以在验证用户时同时尝试这两种方法。或者甚至只是用MD5和SHA-512/salt散列新密码,这样它们就可以像旧密码一样处理

从编程角度讲,我认为这不会是一个问题,但我对加密/散列的了解还不够,不知道我是否通过对已经进行MD5散列的密码应用SHA-512/salt散列以任何方式损害了散列的质量。我的第一直觉是,如果有什么,它会更强大,一个非常轻的键拉伸


我的第二个直觉是,我真的不知道我在说什么,所以我最好得到建议。有什么想法吗?

相信你的第二本能。使用现有的专门用于散列密码的库,而不是试图伪造自己的密码库

可能先用MD5散列新密码,然后用密码散列库散列MD5。这样,您就可以保持与旧密码的向后兼容性

即密码散列(所有旧的md5'd密码)和密码散列(md5(新密码))

(警告:我不是密码专家)


如果先使用MD5散列,则只能使用MD5(128位)的排列。SHA512的大部分空间不会被您的密码覆盖。因此,您不会利用SHA512,但它不会比MD5更差

您的好处是,如果有人获得SHA512散列,但不知道salt(您必须以某种方式强制执行),则无法查找散列并获取密码——这在您现在拥有的MD5数据库中是可能的


因此,是的,您可以重新设置现有的MD5密码。但正如第一段中所解释的,将MD5应用于所有新密码,然后将它们散列为SH512是一个坏主意。一个简单的实现是在数据库中哈希旁边有一个布尔“salt”字段(但不要将salt放在那里)。

使用加密原语的函数组合是危险的,如果可以避免,就不应该这样做。这类问题的常见解决方案是在迁移期间保留两个哈希值,在可能的情况下使用新的哈希值,并透明地升级旧密码(当您检查密码并且密码匹配时,使用新算法重新刷新并存储密码)


如果你有一个基于质询-响应的方案,你看不到明文密码,那么这将不起作用,但因为你似乎有一个存储的salt,它不会改变,我假设你的应用程序会进行哈希运算。

如果你看看大多数银行和高安全性人员是如何改变密码的。他们中的大多数人基本上要求使用旧加密方法的人创建新密码。我认为第一个解决方案是在所有现有的旧MD5密码用户上设置一个标志,并通知他们需要创建新密码,然后缓慢地将他们迁移到新系统。这样,当你对系统进行故障排除时,如果出现任何问题,你不会问这是新用户还是老用户。我们是双重散列还是单一散列?永远不要比较两个散列作为可能的答案,因为如果MD5('abc')=>123,SHA('NO')=>123,这意味着可能有人输入了错误的密码,但仍然可以输入。

哦,我不打算编写自己的散列库,我只需要知道如何处理现有的MD5散列密码!我不是密码专家,但我只是在现有MD5密码上运行密码哈希函数。对于新密码,您将首先执行旧的MD5算法,然后将其提供给适当的密码哈希函数。或者你可以在数据库中标记密码使用的是旧的还是新的算法(或者你存储它的任何地方)。@tangrs他的原始密码也是MD5哈希的,它已经安全了。他想换成更安全的含盐的SHA-512。你到底为什么要向他建议双重散列?这仍然不能解决如何区分新旧密码的问题。双重散列是通过模糊实现的安全性,这和没有安全性一样好,因为没有人知道到底发生了什么以及如何维护它。我的意思是双重散列是一种向后兼容的方法。(不可否认,它确实看起来既便宜又懒惰)
但不要把盐放在那里
-盐的全部意义在于它不必保密,只需将明文放在散列值旁边(每个密码有一个唯一的散列!)。另外:是基于任何实际事实还是直觉,“用SHA-512散列MD5密码不会造成任何伤害”?因为通常情况下,按顺序应用多个哈希可能弊大于利。哈希函数的要点是,它提供了可变大小字符串和n个位之间的唯一映射。任何好的散列函数都可以避免冲突,事实上,在SHA-512甚至MD5上产生冲突是非常困难的(除非您具有任意长度,而您在密码中没有这种长度)。将128位值映射到512位空间非常简单(您有2^(512-128)个未使用的值)。碰撞(即伤害)极不可能发生(概率2^(128-512))。这是一个很好的答案。我以前就实现过这种类型的解决方案,这是一种很好的方法。感谢您在用户登录时提出的透明重新灰化建议!你有任何解释的链接吗