密码哈希应该以二进制或十六进制数存储吗?

时间:2012-08-08 18:44:07

标签: php mysql security hash passwords

我通常将它存储在十六进制数字中但是我意识到如果我将它存储在MySQL内的二进制文件中,我可以节省一半的空间。如果我决定将它存储在二进制文件中,是否有任何问题需要注意?

4 个答案:

答案 0 :(得分:7)

您希望存储多少个密码?半空间对你来说意味着什么?

您可能在应用程序中以十六进制形式表示密码,因此在对这些密码执行任何操作时,将它们以二进制形式存储会增加另一层复杂性和处理开销。

我的意见是你应该以便于你使用的方式存储它们,而不是为你节省很少空间的方式。

修改

做出一些假设,并借此机会再帮助你。

由于你的密码是十六进制的,我假设你没有使用crypt,如果你不是,你应该是。最糟糕的情况是,你正在使用md5 ......并且上帝正在杀死小猫。

关于堆栈溢出的bcrypt已经有很多问题和答案,所以我不会在这里再次介绍这些信息。

问题SHA512 vs. Blowfish and Bcrypt是一个很好的起点。

还阅读了关于此主题的几篇@ircmaxell博客文章:

答案 1 :(得分:4)

从可用性的角度来看,最好将哈希值存储为十六进制。以二进制形式存储它们意味着需要再一步将纯文本输入与存储的密码进行比较。它还有可能在你继续前进后为任何在你的项目上工作的人增加一层混乱。 “为什么这个密码存储在二进制文件中?”

答案 2 :(得分:4)

免责声明:说实话,这个问题必须完全基于观点而封闭。因此,您得到的任何答案都是喜好和经验的问题。

只需添加我对这个问题的常识答案:您应该以从加密工具/方法中获取它的方式来存储它。

任何好的加密方法都有encryptdecryptcompare方法。通常,您需要将encrypt的输出作为输入传递到decrypt / compare

无论输出encrypt产生什么,都应该是存储它的首选方式。

您可以将输出转换为任意值,无论是二进制,十六进制,base64还是使用笔和纸将其记录下来,加密的值都不会或多或少变得安全。找到该值的人将需要加密密钥对其进行解密。

但是,每次转换时,还需要将其转换回以前的状态。这意味着您将增加一层潜在的问题,并增加整个过程的开销。不管它有多微不足道,它仍然比完全不执行要复杂/慢。

答案 3 :(得分:0)

密码的主要动机是它的安全性,而不仅仅是扩展其在数据库中占用的大小或空间,因此,您的密码必须包含所有安全实体例如算法算法选项(例如:时间成本,内存成本,线程),哈希密码 >。所有这些共同使您的密码比简单的十六进制或二进制密码更强大。

参考:

Safe Password Hashing

Password Hash

并且按照第一个链接哈希密码时建议使用的算法是Blowfish,这也是密码哈希API所使用的默认算法,因为它的计算量比MD5或SHA1高得多,而仍然可扩展的。

您可以使用

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

输出

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

这里的密码由所有算法算法选项(例如,时间成本,内存成本,线程数),,< strong>哈希密码