我即将创建一个项目,我想重点关注它将具有的安全性,并且我即将开发登录,一般我使用Sha-1加密密码,我不知道它是否是最安全的,但到目前为止它不像 MD5 那样健壮。
我的问题是,在这种密码情况下,我是否对 Sha1 的安全性和数据加密感到满意,或者是否有任何其他更安全的哈希可以使用?
正如我所提到的,我想尽可能多地关注这个系统的安全性,如果您了解有关安全性的额外信息或从经验中了解更多信息,那真的会对我有很大帮助。
我即将创建一个项目,我想重点关注它将具有的安全性,并且我即将开发登录,一般我使用Sha-1加密密码,我不知道它是否是最安全的,但到目前为止它不像 MD5 那样健壮。
我的问题是,在这种密码情况下,我是否对 Sha1 的安全性和数据加密感到满意,或者是否有任何其他更安全的哈希可以使用?
正如我所提到的,我想尽可能多地关注这个系统的安全性,如果您了解有关安全性的额外信息或从经验中了解更多信息,那真的会对我有很大帮助。
介绍
我们始终专注于将安全性置于我们的系统中,但问题不是在外部保护它,而是在内部保护它。
即使我们让 Chuck Norris 来保护系统,如果我们的数据库设计不佳或 SQL 语句结构不佳,系统也会不安全。
所以这里有一些小建议:
1)使用 PDO 代替 mysql / mysqli,增加安全性并避免 SQL 注入
读:
我见过的最好的 PDO 指南: https ://phpdelusions.net/pdo
如何保护自己免受 SQL 注入: https ://phpdelusions.net/sql_injection
如何避免 PHP 中的 SQL 注入?
什么是 SQL 注入,如何避免它?
如何防止 SQL 注入?: https ://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php
2)使用 SQL 语句作为编程语言(它是)而不是简单的字符串。
3)避免使用 GET,而使用 POST。
密码安全:
我认为重要的编程格言:“始终不信任用户”,因此我必须避免给他们密钥(用于对称和非对称加密方法)或解码信息的方法,普通用户不会做任何事情,但是一个知识渊博甚至只是好奇的人可能会造成严重破坏。
阅读: -安全性 - 对称、非对称和散列加密之间的差异:http : //blog.capacityacademy.com/2013/08/16/seguridad-informatica-cifrado-symmetrico-asimetrico-hashing/
那我该怎么办?:
使用散列:
在 PHP 中我们有几种方法,包括 md5() 和 sha1(),但官方文档告诉我们:
也就是说,它们可以反转:
例子:
更多研究:
PHP 密码手册:http: //php.net/manual/es/faq.passwords.php
现在用什么方法?
很简单,一个原生于 PHP
password_hash()
:.我会给你一个为 PHP 5.5 的 password_hash() 创建的 polyfill 的链接。
虽然自 PHP 5.5 起包含此库,但它
polyfill
有一个演示,逐步解释如何使用它:PHP 5.3 和 5.4 的类似 PHP 5.5 的密码函数:
https://github.com/Antnee/phpPasswordHashingLib
如何使用它?:
这将是我们将存储在数据库中的密码。
要验证:
我们从数据库中获取密码。
现在我们将输入的密码的 POST 保存在一个变量中以进入系统:
我们使用 password_verify(),这将负责检查该数据是否与我们保存的哈希相对应。
PHP 将保存
salt
用于验证该密码有效性的那个,如果我们有 100 次相同的数据,例如“123456”,每个哈希值都会有不同的值。现在,建议数据库中的密码字段的长度为 255 和 type
varchar
,因为哈希是字母和数字的组合。哈希类似于指纹。它对加密数据毫无用处,因为这意味着应该有某种方法可以从散列中恢复原始数据,而这是不可能的。
MD5 哈希算法将数据块减少到 128 位占用空间。
SHA-1 哈希算法将数据块减少为 160 位指纹。
最初,如果与盐一起正确使用,两者都应该足够安全,但问题是在这两种情况下都发现了产生“碰撞”的方法,而不必对总位数使用暴力。
在大多数算法中,您需要大量的“免费”数据才能计算出产生碰撞的东西。在 MD5 的情况下,需要 128 个字节,因此如果密码不能有 128 个字符,则该算法不能用于产生冲突。
在 SHA-1 的情况下,有一些算法可以将中断减少到 2^63。
引入盐大大降低了发生碰撞的可能性。
当使用已被证明易受攻击的 HASH 显然很危险时,它是确认文件的完整性,例如可执行文件,因为这些文件有更多字节需要修改以产生冲突。
SHA-2目前使用不同的哈希长度:256、384 和 512 位。
尽管对于较大位大小的算法更难找到冲突,但始终建议使用盐。
所有算法(在线尝试一种)都容易受到彩虹表攻击。甚至还有一些常见的盐形式的彩虹表,但它大大增加了数据库的大小。
简而言之,要使用几个字符(例如 32 或 64 个字符)存储密码的哈希值,不需要非常安全的哈希算法,但需要使用良好的盐进行良好的加固。
我的推荐?将 SHA-2 与 salt 一起使用,或者将工作留给 PHP 的password_hash()函数,该函数将选择迄今为止最安全的算法和最佳 salt 方法(请注意,在这种情况下,您应该保留您的 PHP 版本)。
最相关的文档: