SQL:MD5() 与 hex()

问题描述 投票:0回答:7

SQLite没有内置MD5,所以我正在考虑使用散列函数。我对散列不太了解,但我可以看到 hash() 输出是数字且长度不同,而 MD5() 返回固定长度的混合字符/数字。

我在 stackoverflow 或 google 上找不到任何相关内容。

可以使用带盐的 hash() 来安全地存储密码吗?


编辑:超级尴尬的错误,我实际上是 hex(),而不是 hash() - 抱歉这个错误

php sql sqlite hash md5
7个回答
2
投票

hex()
不是加密函数。它所做的只是返回您传递给它的字符串的十六进制值。这不是存储密码的安全方式。

您希望在将密码存储到 SQLite 数据库之前创建一个哈希值。按照其他答案的建议,使用 PHP

hash()
函数。


1
投票

您也将其标记为 PHP,那么为什么不使用 PHP 函数来完成您需要的功能呢? PHPass 现在似乎很热门,因为人们正在远离

sha1()
md5()


1
投票

只要使用种子就可以使用哈希来存储密码,并且每个密码都使用单独的种子。哈希函数创建的值对于唯一字符串来说是唯一的(您也可以对其他数据类型进行哈希处理),因此它是您任务的良好候选者。


1
投票

使用 php 哈希函数,您可以将 SHA256 传递给第一个参数,它将创建密码 + 盐的强哈希。不需要额外的扩展,对于除银行网站等高安全系统之外的 Web 应用程序,sha256 就可以了。甚至可能有点矫枉过正。

hash('sha256',$salt . $password);

应该可以解决问题。现在,您可以将数据保存在数据库的 varchar 列中,因为哈希函数输出十六进制字符串。哈希函数具有可变的输出,因为它可以使用许多不同的哈希算法。如上所示,具有 sha256 的哈希函数将输出字符串中的 64 个字符。将盐放在开头比放在末尾更好,因为哈希开头的随机性比末尾的随机性更好。


1
投票

我在 SQLite 文档中找不到有关 hash() 函数的任何内容。您可能正在使用包含一些基本第三方 C/C++ 插件的 SQLite,或者您可能正在使用 PHP hash() 函数(它允许您指定要使用的哈希算法)。

一般来说,单向哈希是存储密码的一种好方法,如果它是与 SHA256 一起使用的 PHP 哈希,我认为它没有理由不适合您。请注意,某些哈希函数已被证明存在缺陷; MD5 可以产生可预测且可利用的冲突,而 SHA1 也存在理论上的漏洞。包括 SHA256 在内的 SHA2 算法均基于 SHA1,但尚未显示出存在同样的弱点。

在任何情况下,为了帮助确保唯一的哈希值,请使用生成等于或大于消息的哈希值的哈希算法;证明给定一组有限的散列值,对于大于散列大小的每个消息集不可能有唯一的散列值,这很简单。


0
投票

您可能正在使用 PHP hash() 函数,该函数的功能远不止于此。我会远离 SHA1 和 MD5,因为它们都有漏洞或已知的反向查找表(IE,如果有人获得散列密码,他们可以访问许多在线可用的网站并输入该密码,它会给他们一个密码当通过 MD5 或 SHA1 传递时,将给出相同的密码。)

hash(256) 或 hash(512) 远远超出您可能需要的范围,因此这些可能是安全的。只要记住给你的密码加盐即可。你永远不会太小心。


0
投票

sqlite-hashes 是一个可加载扩展,它将

MD5, SHA1, SHA224, SHA256, SHA384, SHA512, FNV1a, XXHASH
添加到 SQLite(或者您可以直接从 Rust 代码中使用它)。

这将允许您使用 SQL 来获取哈希值,而无需在代码中处理它:

  • SELECT md5(data) FROM tbl

(免责声明:我是作者)

© www.soinside.com 2019 - 2024. All rights reserved.