1

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

我在 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 数据库中的用户表中,我可以阅读:

  • 在“登录”列中实际键入的登录示例:如果有人键入“迈克尔”,我将在 SQL 数据库中看到“迈克尔”

  • 在“密码”列中实际输入的登录示例:如果有人输入“水果”,我将在 SQL 数据库中看到像“e8bfab56c53980cd014206c8da2f8c9b9708eaacc61”这样的散列值

我的问题很简单,但可能有点天真(我是新手):我认为我仍然可以在我的数据库中的某处读取实际密码,并且哈希只是为了保护密码不被拦截和读取而它正在发送。我永远不知道,有人可能会要求我将他的真实密码发送给他。但我唯一能看到的是密码列中的“散列”。

  • 是这样设计的吗?
  • 是否也可以可视化真实密码?
4

4 回答 4

4

如果您能够“解码”这些密码,那将不是一个非常安全的系统。一旦有人获得了对您数据库的访问权限 - 他们将能够在不知情的情况下访问每个人的密码...

如果您曾经忘记了某个网站的密码(我们都有 - 不要否认!),您会记得他们通常*不会简单地将您的密码(以纯文本形式)发送给您,以提醒您电子邮件 - 他们会给你机会重置它。这样(通常通过您的电子邮件/电话号码进行验证)他们会知道您确实是开设帐户的人。

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


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

于 2012-07-16T20:39:35.903 回答
3

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

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

如果黑客入侵了你的数据库并拥有这样的表,他就可以恢复密码。例如,黑客获取管理员用户哈希“some_hash3”,然后黑客在哈希表中搜索该哈希,发现哈希“some_hash3”有密码“qwerty”和“some_data”,黑客将尝试使用这些密码登录。结果:使用盐。对于现在的黑客有这样的表 6 符号密码。但是您可以用非常简单的技术“吸”它们:当您将密码存储在数据库中时,向密码添加一些值(盐)并从该值哈希中获取:

// somewhere in code, where creating/updating users password

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

当您检查密码时,请使用相同的逻辑

谢谢

于 2012-07-16T21:02:19.707 回答
0

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.openssl.php。

但正如这里的其他人所说,这样的事情是合理地没有完成的;)

于 2012-07-16T22:40:45.587 回答