【发布时间】:2011-06-28 12:48:47
【问题描述】:
SQLite 没有内置 MD5,所以我正在考虑使用散列函数。我不太了解散列,但我可以看到 hash() 输出是数字且长度可变,而 MD5() 返回固定长度的混合字符/数字。
我在 stackoverflow 或谷歌上找不到任何关于此的内容。
可以使用带盐的 hash() 来安全地存储密码吗?
编辑:超级尴尬的错误,我实际上是用 hex(),而不是 hash() - 抱歉这个错误
【问题讨论】:
SQLite 没有内置 MD5,所以我正在考虑使用散列函数。我不太了解散列,但我可以看到 hash() 输出是数字且长度可变,而 MD5() 返回固定长度的混合字符/数字。
我在 stackoverflow 或谷歌上找不到任何关于此的内容。
可以使用带盐的 hash() 来安全地存储密码吗?
编辑:超级尴尬的错误,我实际上是用 hex(),而不是 hash() - 抱歉这个错误
【问题讨论】:
你也把它标记为 PHP,那么为什么不使用 PHP 函数来完成你需要的呢? PHPass 现在似乎很热门,因为人们正在远离 sha1() 和 md5()。
【讨论】:
只要您使用种子,就可以使用哈希存储密码,并为每个密码使用单独的种子。散列函数创建的值对于唯一字符串是唯一的(您也可以散列其他数据类型),因此它非常适合您的任务。
【讨论】:
使用 php 哈希函数,您可以将 SHA256 传递给第一个参数,它将创建密码 + 盐的强哈希。不需要额外的扩展,对于像银行网站这样的高安全系统以外的 Web 应用程序,sha256 就可以了。它甚至可能是矫枉过正。
hash('sha256',$salt . $password);
应该做的伎俩。现在您可以将数据保存在数据库的 varchar 列中,因为散列函数输出一个十六进制字符串。散列函数具有可变输出,因为它可以使用许多不同的散列算法。如上所示,带有 sha256 的哈希函数将在字符串中输出 64 个字符。把盐放在开头比放在结尾好,因为哈希开头的随机性比结尾的随机性好。
【讨论】:
我在 SQLite 文档中找不到任何关于 hash() 函数的内容。您可能正在使用 SQLite 并包含一些基本的第三方 C/C++ 插件,或者您可能正在使用 PHP hash() 函数(它允许您指定要使用的哈希算法)。
一般来说,单向散列是一种存储密码的好方法,如果它是 PHP 散列,与 SHA256 一起使用,我看不出它为什么不适合你。请注意,一些散列函数已经证明存在缺陷; MD5 可以产生可预测和可利用的碰撞,SHA1 也存在理论上的漏洞。包括 SHA256 在内的 SHA2 算法基于 SHA1,但尚未显示出同样的弱点。
在任何情况下,为了帮助确保唯一的散列,请使用产生等于或大于消息的散列的散列算法;证明给定一组有限的散列值,对于大于散列大小的每组消息,不可能有唯一的散列值。
【讨论】:
您可能正在使用 PHP hash() 函数,它的功能性更强。我会远离 SHA1 和 MD5,因为它们都有漏洞或已知的反向查找表(即,如果有人获得了散列密码,他们可以访问许多在线可用的站点并将其输入,它会给他们一个密码这将在通过 MD5 或 SHA1 时提供相同的密码。)
hash(256) 或 hash(512) 比您可能需要的要多得多,所以这些可能是安全的。只要记住给你的密码加盐。你永远不能太小心。
【讨论】:
hex() 不是加密函数。它所做的只是返回您传递给它的字符串的十六进制值。这不是一种安全的密码存储方式。
您想在将密码存储到 SQLite 数据库之前创建一个哈希值。按照其他答案的建议,使用 PHP hash() 函数。
【讨论】: