当使用sha256时,SQL表中的实际密码可视化


Actual password visualisation in SQL table when using sha256

我正在接受安全登录过程的培训。

我在sign_up.php:中使用了sha 256

$username= check_input($_POST['username']);
$password= check_input($_POST['password']);
//the password is encrypted in sha256
$secure_sign_up_password = hash('sha256', $password);

当然,在SQL数据库中的用户表中,我可以读取:

  • 在"login"列中,实际键入的登录名示例:如果有人键入"michael",我将在SQL数据库中看到"michael"

  • 在"password"列中,实际键入的登录名示例:如果有人键入"fruit",我将在SQL数据库中看到散列值,如"e8bfab56c53980cd014206c8da2f8c9b9708eaacc61"

我的问题很简单,但可能有点天真(我是个新手):我认为我仍然可以读取数据库中某个地方的实际密码,而哈希只是为了保护密码在发送时不会被拦截和读取。我永远不知道,有人可能会让我把他的真实密码发给他。但我唯一能看到的是密码栏中的"hashed"。

  • 它是这样做的吗
  • 是否也可以可视化真实密码

如果你能够"解码"这些密码,这将不是一个非常安全的系统。一旦有人访问了你的数据库,他们就可以在不知情的情况下访问每个人的密码。。。

如果你忘记了网站的密码(我们都忘记了——不要否认!),你会记得,他们通常不会简单地将你的密码(纯文本)发送给你作为电子邮件提醒-他们会让你有机会重置。这样(通常通过你的电子邮件/电话号码进行验证),他们就会知道你确实是开户人。

*如果他们以纯文本形式向您发送密码,这可能意味着他们正在以这种方式或其他易于解密的形式存储密码。这个网站很可能没有他们想象的那么安全


如果你有兴趣给自己留一个"后门",让自己能够访问任何用户帐户,你可能会考虑在管理员帐户内使用一个特殊的登录表单,允许您使用编码的密码登录。这意味着您只需省去hash('sha256', $password),并传递已编码的$password(从数据库中提取)。这有点麻烦,如果你已经有了管理员帐户,那么以其他用户身份登录就没有多大用处了,因为你已经非常强大了

这是经过设计的除了我,没有人应该知道我的密码是什么。即使你(在这里插入花哨的标题)也不应该知道我密码。如果我忘记了,那是我的问题,但你的网站应该为我提供一种重置它的方法。然后当我重置时,你的网站应再次存储哈希。明文密码不应存储在任何位置。

  1. 永远不要在数据库中以开放格式保存密码。如果有人在系统中发现漏洞,他将能够进行任何sql查询并获取用户密码。黑客将能够以用户身份登录系统,因为他知道用户名和密码
  2. 如果用户想要恢复密码,请提供重新生成密码的功能。永远不要以纯文本形式存储密码
  3. SHA256是散列函数。从数学上讲,这意味着数据只能用一种方式"散列"。我的意思是,从散列你不能恢复数据。你可以阅读http://en.wikipedia.org/wiki/Hash_function关于散列函数和这个http://en.wikipedia.org/wiki/Sha256sha256结果:若有人破解了你们的数据库并获得了用户名和密码,他将无法登录到系统中。因为黑客只有散列数据,无法获得准确的登录密码
  4. 正如我之前提到的,散列函数只能以一种方式作为"散列"数据。但一些黑客为一些预定义的算法构建了大量的大数据。我的意思是,他们为密码建立哈希表。这样的哈希表看起来像这样:
密码散列------------------某人的现金b some_hash2。。。。。qwerty some_hash3some_data some_hash3——是的,数据可能会发生冲突。查看有关哈希函数的wiki

若黑客入侵了你们的数据库并拥有这样的表,他就能恢复密码。例如,黑客获取管理员用户哈希"some_hash3",然后在哈希表中搜索该哈希,发现哈希"some_hash3"的密码为"qwerty"answers"some_data",黑客会尝试使用该密码登录。结果:使用盐。如今,黑客们有这样的6符号密码表。但你可以用非常简单的技术"吸取"它们:当你把密码存储在数据库中时,给密码添加一些值(salt),然后从这样的值散列中得到:

// somewhere in code, where creating/updating users password
$password = hash('sha256', $salt.$password);

当你要检查密码时,使用相同的逻辑

感谢

sha256哈希和其他哈希是一种方式。看见http://en.wikipedia.org/wiki/Cryptographic_hash_function.如果您希望能够解密您在数据库中的密码字段中所写的内容,则可能需要使用另一种方法。

您可以使用不与用户共享的密钥进行加密,而不是创建哈希。看看http://www.php.net/manual/en/book.mcrypt.php.不过,密钥将是代码的一部分,因为它是对称加密的。

要做到真正安全,请尝试真正的PKI加密(使用公钥加密,使用私钥解密)。查看php.net/manual/en/function.gnupg-encrypt.php或php.net_manual/en/book.opensl.php。

但正如这里的其他人所说,这样的事情是合理的不做;)