php - 如何在mysql中解密密码

标签 php mysql encryption

直奔我的问题,我已经阅读了有关在注册用户时加密密码的信息。直到这里我才能使用 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 occurred,表示密码不正确。我还补充说,在数据库中加密密码之前,这段代码工作正常。我是加密过程的新手,需要你的一点帮助,这将帮助我了解更多。提前致谢。

最佳答案

您不加密密码,而是散列它们。

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

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

如果用户密码是“horse123”,您可以将其存储为 8。然后你只需数一下密码中的字母,如果是 8,你就知道它是对的。

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

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

相反,我们使用单向哈希函数。最常见的方法是使用 MD5 散列。 (这不是最好的,但解释起来很简单)。有关如何实际执行此操作,请查看 http://www.openwall.com/phpass/ .

对于简短而甜蜜的版本:

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

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

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

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

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

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

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

并且绝对阅读 SQL 注入(inject)和 SQL 准备语句,否则这一切都毫无意义!

关于php - 如何在mysql中解密密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19077118/

相关文章:

php - 在 PHP 数组中搜索一些文本

php - 在 Linux 上备份上传的文档

Mysql比较逗号分隔的字段与单个字符串

html - 链接 css 文件会破坏 html 表格格式

java - 仿射密码解密过程错误结果

java - 解密使用 Java 加密的 MySQL 字段

php - Ajax 成功后刷新/重新加载页面 - Laravel

php - while循环重复一条记录?

java - 双重加密 2048 RSA?

php - 解析googleapi输出php