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