2012-07-16 74 views
1

我正在接受培训以确保登录过程安全。使用sha256时SQL表中的实际密码可视化

我在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”:我想我仍然可以在我的数据库的某个地方读取实际的密码,并且散列只用于保护密码在发送时被拦截和读取。我永远不知道,有人可能会要求我给他发送他的真实密码。但我唯一能看到的就是密码栏中的'哈希'。

  • 它是这样做的吗?
  • 是否有可能将可视化的真实密码?

回答

2
  1. 千万不要永远不要在数据库中保持开放格式的密码。如果有人在系统中发现漏洞,他将能够进行任何sql查询并获取用户密码。黑客将能够以用户身份登录到系统,因为他知道用户名和密码
  2. 如果用户想要恢复密码,请创建用于重新生成密码的功能。切勿以纯文本格式存储密码。
  3. SHA256是哈希函数。在数学上它意味着 - 数据只能以一种方式“散列”。我的意思是,从哈希那你不能恢复数据。您可以阅读有关散列函数http://en.wikipedia.org/wiki/Hash_function以及关于http://en.wikipedia.org/wiki/Sha256 sha256 的结果:如果有人破解您的数据库并获取用户名和密码,他无法登录到系统。因为黑客只有哈希数据,并且无法获得准确的密码进行登录。
  4. 正如我前面提到的,散列函数只能以一种方式“散列”数据。但是一些黑客为一些预定义的算法构建了大量的大数据。我的意思是,他们建立密码散列表。这样的哈希表看起来是这样的:
 
    password hash 
    ------------------ 
    a   some_hash1 
    b   some_hash2 
    ...   ..... 
    qwerty  some_hash3 
    some_data some_hash3 -- yes, data can have collisions. See wiki about hash functions 

如果黑客入侵你的数据库,并有这样的表,他能恢复密码。例如,黑客获取管理员用户散列表“some_hash3”,然后黑客在散列表中搜索这样的散列,发现散列“some_hash3”具有密码“qwerty”和“some_data”,黑客将尝试用这些密码登录。 结果:使用盐。目前黑客拥有6个符号密码的表格。但是你可以在非常简单的技巧“吸”出来:当你在数据库中存储的密码,加密码某些值(盐),并从该值哈希得到:

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

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

,当你将检查密码,请使用相同的逻辑

谢谢

+1

+1 - 这是一个非常丰富的答案。 – Lix 2012-07-16 21:39:17

+0

正式注意!谢谢 – Mathieu 2012-07-17 08:14:10

3

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

4

如果你将能够“解码”这些密码,它不会是一个非常安全的系统。一旦有人获得了进入你的数据库 - 他们将能够密码访问每个那些没有他们知道......

如果你曾经忘记了密码的网站(和我们每个人都有 - 不否认!),你会记得他们通常* 不需要只需发送你的密码(纯文本)作为提醒你的电子邮件 - 他们会给你机会重置它。通过这种方式(通常通过您的电子邮件/电话号码进行验证),他们会知道您的确是开户人。

*如果他们以纯文本形式向您发送密码,可能意味着他们正在以这种方式或以其他易于解密的形式存储密码。这个网站是最有可能不是安全的,因为他们想客户所想...


如果您有兴趣留下自己各种各样的“后门”,以便能够访问任何用户帐户,有什么你可能认为这样做是有从您的管理员帐户,它允许您使用编码的密码登录里面一个特殊的登录表单的。这意味着,您只需离开了hash('sha256', $password)并通过$password已编码的(你从提取您数据库)。这有点冒失,如果你已经有一个管理员帐户,那么就不会有太多用处,因为你已经是一个强大的

+1

只是为了一个小细节钉 - 你可能想使用更强的哈希算法比SHA256这些天。目前流行的观点是,bcrypt()是要走的路。 – 2012-07-16 20:53:04

+1

这一切都取决于你的应用程序。对于一个简单的低风险非敏感类型的系统,只需在字符串末尾添加一些盐就足够了。更好的安全比抱歉,虽然...你说什么关于' wiki bcrypt' ... – Lix 2012-07-16 20:56:14

+1

谢谢,现在完全理解。 – Mathieu 2012-07-17 08:12:22

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。

但在其他位置都表示,这样的事情是合理的没有做;)