我正在创建登录网站。我有密码哈希,我的问题是 - 在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(出于安全原因)。
答案 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加密数据库中的信息,但不是您真正想要搜索或索引的任何内容。