我通常将它存储为十六进制数字,但我意识到如果我将它存储在 MySQL 中的二进制文件中,我可以节省一半的空间。如果我决定将其存储为二进制文件,我应该注意哪些问题?
4 回答
您希望存储多少个密码?一半的空间对你来说真的那么重要吗?
您可能在应用程序中以十六进制形式表示密码,因此在对这些密码执行任何操作时,将它们存储为二进制会增加另一层复杂性和处理开销。
我的意见是,您应该以方便您使用的方式存储它们,而不是为您节省少量空间。
编辑:
做一些假设,并借此机会进一步帮助你。
由于您的密码是十六进制的,我假设您没有使用crypt
,如果您没有使用,那么您应该使用。最坏的情况,你正在使用 md5 ......而上帝正在杀死小猫。
已经有很多关于 bcrypt on stack overflow 的问题和答案,所以我不会在这里再次介绍这些信息。
不过, SHA512 与 Blowfish 和 Bcrypt的问题是一个很好的起点。
还可以阅读@ircmaxell关于该主题的几篇博客文章:
从可用性的角度来看,最好将散列存储为十六进制。以二进制形式存储它们意味着还需要一个步骤来将纯文本输入与存储的密码进行比较。它也有可能给在你继续工作后从事你的项目的任何人增加一层混乱。“为什么这个密码以二进制形式存储?”
免责声明:让我们说实话,这个问题必须在纯粹基于意见的情况下被关闭。因此,您得到的任何答案都是偏好和经验的问题。
只是为这个问题添加我的常识答案:您应该以从加密工具/方法中获取它的方式存储它。
任何好的加密都有一个encrypt
和一个decrypt
或compare
方法。通常,encrypt
您需要将输出作为输入传递给decrypt
/ compare
。
无论encrypt
产生什么输出,都应该是存储它的首选方式。
您可以将输出转换为您喜欢的任何内容,无论是二进制、十六进制、base64 还是使用笔和纸写下来,加密值都不会变得或多或少安全。找到该值的人将需要加密密钥来解密它。
但是每次转换某些内容时,您还需要将其转换回之前的状态。这意味着您添加了一层新的潜在问题并增加了整个过程的开销。不管它可能多么微不足道,它仍然比不做它更复杂/更慢。
密码的主要动机是它的安全性,而不仅仅是扩展它在数据库中占用的大小或空间,因此您的密码必须包含所有安全实体,例如算法、算法选项(例如:时间成本,内存成本,线程),盐,散列密码。所有这些都使您的密码比简单的十六进制或二进制密码更强大。
参考:
根据第一个链接,建议在散列密码时使用的算法是 Blowfish,这也是密码散列 API 使用的默认算法,因为它的计算成本明显高于 MD5 或 SHA1,同时仍然具有可扩展性。
您可以使用
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
输出
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
这里您的密码由所有算法、算法选项(例如:时间成本、内存成本、线程)、盐、哈希密码组成