【问题标题】:Trying to hash my passwords but with no success试图散列我的密码但没有成功
【发布时间】:2026-02-15 04:30:02
【问题描述】:

我对 php 安全性相当陌生,对于我的网站,我是注册并登录的,我想添加他们的 md5 密码,但我找不到任何有明确指南的地方添加到注册中,以及需要添加到登录文件和/或数据库中的内容,正如我所说,在网络安全方面我对 php 相当陌生,所以我需要一些帮助,这里是我的注册表单上有什么:

    $error = $user = $pass = "";
if (isset($_SESSION['user'])) destroySession();

if (isset($_POST['user']))
{
    $user = sanitizeString($_POST['user']);
    $pass = sanitizeString($_POST['pass']);


    if ($user == "" || $pass == "")
    {
        $error = "Not all fields were entered<br /><br />";
    }
    else
    {
        $query = "SELECT * FROM members WHERE user='$user'";

        if (mysql_num_rows(queryMysql($query)))
        {
            $error = "Username already taken<br /><br />";
        }
        else
        {
            $query = "INSERT INTO members VALUES('$user', '$pass')";
            queryMysql($query);
            die("<h4>Account created</h4>Please Log in.");
        }

    }
}

我只需要一个示例或一个很好的指南,说明我需要做什么才能使其正常工作。

【问题讨论】:

  • 我没有加盐,我只是用 SHA-1 对密码进行哈希处理,除非 NSA 关注我的用户数据库,否则就足够了,这不太可能发生。
  • 我认为你真的应该阅读准备好的语句,并进一步了解像 Doctrine 这样的“高抽象”解决方案。
  • @Giacomo:不会。您可以在合理的时间(几小时或几天)内破解云端的 SHA1。密码应始终使用强哈希函数(如 sha512)正确加盐和哈希。
  • 哼我知道...但是您必须将安全问题扩展到实际的安全需求。 “我最喜欢的宠物论坛”!=“网上银行服务”。除非你想做老师的宠物。
  • 你不应该使用像sanitizeString()这样的函数

标签: php security md5 salt


【解决方案1】:

我认为您正在寻找盐然后对您的密码进行哈希处理。只需将您选择的字符串添加到密码的前面(如果您愿意,也可以添加到末尾),然后使用 MD5 对其进行哈希处理。

例如

$pass = 'mypassword';
$salt = 'S%gh3578';  //anything you want
$pepper = 'w890rrk'; //anything you want
$query = "INSERT INTO members VALUES('$user', md5('".$salt.$pass.$pepper."'))";
queryMysql($query);

这将使用加盐 MD5 加密将密码存储在数据库中,使用未加盐 MD5 加密的常用密码查找表无法反转该密码。

要检查密码是否有效,您可以执行类似的操作:

$passToCheck = 'something';
$correctMD5 = (retrieve hash from db)
if($salt.$passToCheck.$pepper == $correctMD5)
{    
   //valid login
} else {
   //login failure
}

【讨论】:

    【解决方案2】:

    例如,您可以在插入之前使用 md5($pass),当用户登录时,您可以再次 md5 并检查值是否相同。没有办法 de-md5,因此您通常会根据 md5 DB 值检查 md5 输入。

    【讨论】:

    • 我同意超出安全性是没有用的,但事情不像你说的那样。 md5 可以反转,假设用户选择了一个通用密码,那么如果您窃取数据库,您只需检查一个广泛使用的密码列表及其 md5 哈希值,并知道用户最终使用的密码是什么用于其他网络服务。虽然,这不会每天都发生。但是,请考虑一下。
    • 我这里说的是真的。您需要使用数据库中的 md5 检查发布的(登录时)密码的 md5。没有办法(以编程方式)de-md5!我知道您可以在某些网站上查找流行的 md5,但这与我的评论无关。他在问如何进行......
    • 你太容易了。我太相信过多的安全性有点麻烦和无用,但你不能让他认为 md5($pass) = SAFE。