1

我已经设法创建了一个基本的加密系统,因此当用户最初注册我的网站时,密码会使用 salt、md5 和 sha1 安全地存储在我的数据库中。

现在当用户登录时出现问题,即使我使用相同的方法,发送到数据库的字符串(密码)也不同。我将在下面演示:

这是我使用盐技术将客户添加到数据库页面的基本(目前)。

require "dbconn.php";

$username = $_GET['username'];
$email = $_GET['email'];
$pass = $_GET['pwd1'];
$pass2 =$_GET['pwd2'];
$matching = 0;

if($pass == $pass2)
{
echo "<script type='text/javascript'> window.alert('Your details have been successfully          registered, please proceed to login with your new credentials!')</script>";
echo '<script>javascript:window.close();</script>';

$salt = sha1(md5($pass));
$pass = md5($pass.$salt);

$query = "INSERT INTO customer VALUES    ('".$username."','".$email."','".$pass."','face1.jpg')";   

这又是我的基本(目前)登录页面,再次使用相同的 salt 技术(我省略了此页面的后半部分)

session_start();
require "dbconn.php";

$username = $_GET['username'];
$password = $_GET['password'];

$salt = sha1(md5($password));
$password = md5($password.$salt);

$sql = "SELECT * FROM customer WHERE username ='".$username."' AND   password='".$password."'";

我已经做了一些检查,并且在将密码输入数据库时​​,例如使用密码名称测试:它存储为 34364c859afb02e70306c905374ac2 但是当用户登录时密码是:34364c859afb02e70306c905374ac2d5

4

4 回答 4

4

这里有很多问题:

  1. 不要在 URL 字符串(GET 参数)中传输密码,因为这会使其可见并且可以通过引用 URL 泄漏密码。
  2. 使用准备好的语句。不要使用旧的 mysql_* 函数。而是使用 MySQLi 或 PDO。您发送到数据库的任何参数都应通过准备好的语句,其中两个参数之一在准备好语句后注入参数。这允许您使用 MySQL 驱动程序来转义您的参数并保护您免受 SQL 注入。
  3. 从风格上讲,您应该为变量使用一致的名称。
  4. 检查您的列长度。应该是太短了吧 (缺少 2 个字符)
  5. 您的加盐方法并不真正符合加盐方法的条件,因为它是从原始密码字符串派生的。研究为每个用户生成一个唯一的盐。
于 2013-03-20T15:32:40.403 回答
2

这里有几个问题:

  1. 您不应该使用原始用户输入构建 SQL 查询,您应该转义它。我建议您将 PDO 与准备好的语句一起使用。
  2. 您散列/加密/存储密码的方式根本不安全。尝试一些可以处理这个问题的 PHP 库,它更安全。
  3. 在您的情况下,问题似乎是数据库字段长度。如您所见,您提供的两个哈希几乎相同,除了第一个短 2 个字符。您应该扩展您的数据库密码字段长度。
于 2013-03-20T15:32:22.150 回答
1

您存储的散列对于 MD5 散列来说太短了 - 它有 30 个字符长。

你很可能会修剪它。检查字段的长度,它应该容纳 32 个字符的哈希值。

于 2013-03-20T15:31:40.737 回答
1

您的字符串中缺少 2 个字符。

34364c859afb02e70306c905374ac2
34364c859afb02e70306c905374ac2d5

检查您的 mysql 字段长度。

于 2013-03-20T15:33:32.030 回答