我应该使用数据库或PHP创建哈希

时间:2014-02-19 16:22:49

标签: php mysql sql security hash

我正在创建登录网站。我有密码哈希,我的问题是 - 在PHP中创建哈希是否更好,还是在sql查询中创建它更好?

SQL

INSERT INTO users (USER, PASS) VALUES ("foo",SHA1( CONCAT(  "salt", MD5( 123456 ) ) ) )

PHP

$pass = sha1( "salt" . md5( 123456 ) );
$link->query("INSERT INTO users (USER, PASS) VALUES ("foo","$pass");

它不仅仅是创建用户,还可以在登录时进行检查。

问题是,我听说数据库中发生的一切都比在PHP中更快,但我害怕发送带有清晰可见密码的sql(出于安全原因)。

4 个答案:

答案 0 :(得分:0)

您应该尽早散列密码。绝对是用PHP而不是SQL。

您不应该使用md5来哈希密码。它已经过时且不安全。以下是现代安全密码存储的参考:https://crackstation.net/hashing-security.htm#properhashing

答案 1 :(得分:0)

您列出了有效的安全问题,因此请继续在PHP端处理它。除非您处理大量流量,否则您无需担心两者之间的微小性能差异。

答案 2 :(得分:0)

  

我听说数据库中发生的一切比在php中更快

没有。通常,批量操作(即影响多行的操作)在漫游数据库中要快得多。但是,Web服务器和应用程序服务器(即PHP)易于水平扩展。但是数据库不能很好地扩展 - 因此,即使它通常远离“高效”,在应用层执行批量操作也是一种更具可扩展性的解决方案(facebook将其查询结果排序为PHP而不是数据库)。

因此,简而言之,哪个更好取决于您在问题中未解决的问题。

如果您绝对需要最快的解决方案,那么您应该自己测量

生成散列哈希的BTW只是在燃烧CPU周期 -

SHA1( CONCAT(  'salt', MD5( 123456 ) ) )

不比

更安全
SHA1( CONCAT(  'salt', '123456') )

<强>更新

我确实想到了一个问题:在数据库中进行加密可能会扩大攻击面(例如日志中出现的纯文本密码)。

答案 3 :(得分:0)

从技术上讲,您可以非常安全地将未加密的密码从应用程序传递到数据库服务器,即使它们位于不同的计算机上 - 它们都是TCP / IP,因此可以根据需要进行加密......但是,为什么?在应用程序中生成哈希的开销很小(根据您正在做的事情,它甚至可以更高效),并且它提供了更大的灵活性和易用性。

您可以访问PHP本身的预先存在的库/函数,而不是创建“自己动手”的解决方案,例如Hash,它允许您选择要使用的算法。

如果您真的觉得需要使用全面的锡箔帽,您可以使用AES_ENCRYPT加密数据库中的信息,但不是您真正想要搜索或索引的任何内容。