【问题标题】:How to decrypt password in mysql如何在mysql中解密密码
【发布时间】:2013-09-29 10:44:31
【问题描述】:

直接回答我的问题,我已经阅读了有关在注册用户时加密密码的信息。直到这里我能够使用PASSWORD('$PASS'); 注册用户的加密密码,其中$PASS 是用户密码。我的sql表details如下:-

FNAME
LNAME
EMAIL
PASS // USED ENCRYPTION AS PASSWORD('$PASS'); HERE.

我不明白如何解密密码并在我的代码中进一步使用我使用以下代码来解密密码,但它不起作用。 !

<?php
$EMAIL = $_POST['email'];
$PASS = $_POST['pass'];

mysql_connect('host', 'user', 'pass');
mysql_select_db('userdb');
$results = mysql_query(sprintf("SELECT FNAME,LNAME,EMAIL,PASS FROM `details`
WHERE PASS=PASSWORD('$PASS')", 
mysql_real_escape_string($EMAIL))) or die(mysql_error()); 
while($row = mysql_fetch_assoc($results))
{$rows[1] = $row;} 
if(!($_COOKIE['pass'] == $rows[1][PASS])) 
//cookie is set while registering user , which is the decrypted(original) value of password.
{ die("Error occured"); } 
else { echo "Password entered is correct"; }

 ////.....my further code here.
  ?> 

页面显示Error occured,表示密码错误。我还补充说,在数据库中加密密码之前,此代码可以正常工作。我是加密过程的新手,需要您的帮助,这将帮助我了解更多信息。提前致谢。

【问题讨论】:

标签: php mysql encryption


【解决方案1】:

你不加密密码,你散列它们。

重点是,您实际上并不需要用户密码,您只需要知道他们知道密码即可。

例如,一个绝对糟糕的方法可能是一个简单的计数:例如

如果用户密码是“horse123”,您可以将其存储为8。那你就数一下密码里面的字母,如果是8就知道是对的了。

这意味着您永远不需要知道实际密码。

显然这很糟糕,因为有很多 8 个字符的密码!我们需要一些“碰撞”更少的东西。

相反,我们使用单向哈希函数。最常见的方法是使用 MD5 哈希。 (这不是最好的,但很容易解释)。具体如何操作,请查看http://www.openwall.com/phpass/。

对于简短而甜蜜的版本:

获取用户密码,然后执行以下操作:

$pass = md5('somerandomtextthatyouknow'.$_POST['password']);

然后,将其存储在您的数据库中。

当他们登录时,您再次执行相同操作,并检查您数据库中的哈希值。

这样,您永远不需要知道实际密码,密码可以任意长,如果您的数据库被盗,哈希对任何人都没有用(因为我们在随机文本中添加了)。

所以,现在你明白了,请阅读:

http://www.openwall.com/phpass/

并且绝对阅读SQL注入和SQL准备语句,否则这一切都没有意义!

【讨论】:

  • 一个很好的散列介绍,但没有提到每个用户的加盐。也就是说,秘密随机文本应该提供足够的盐来防止彩虹表攻击,这是一个好的开始!
  • 是的,我想我会经历某人可能使用的绝对最低限度。如上所述进行操作比什么都不做要好得多,但实际上只需阅读openwall.com/phpass 并使用它。 :)
  • 是的。顺便说一句,我也更喜欢count() 的描述为“具有高冲突率的哈希函数”:-D
  • 在我写它的时候就想到了——这可能是一个很好的方式来解释单向哈希而不涉及任何数学。我本来想说将其存储为h83,即以h 开头,具有8 字符,并以3 结尾,但我认为有人可能会停在那里并实际实现它!
  • 我会建议像 $password =(CRYPT_SHA512==1)? crypt($password,'$6$rounds=20000$!Z#XC542yuiot&amp;*M^%YTDSFASDAHJillbe$'):FALSE; 这样的东西而不是 md5!!
【解决方案2】:

您不应该加密密码。你应该散列他们。这样就无法解密了。

You can read more about it here.

【讨论】:

    【解决方案3】:

    最好的解决方案是使用 HASH 码,而不是使用加密和解密。

    md5($pass) - 给你 32 位唯一的哈希码

    类似sha256(), hash()...等

    将这些哈希码存储在您的数据库中的密码位置。

    哈希码是一种方式。所以它对您的用户来说更安全。

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
      • 好吧,感谢您的提醒。但是,我觉得最好将需要它的人重定向到可靠的来源,而不是挑选某人的想法并把它放在论坛上,就好像它是我的一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2012-11-29
      • 2019-08-22
      • 2017-11-13
      • 2012-02-03
      • 2020-05-20
      • 2017-05-05
      相关资源
      最近更新 更多