【问题标题】:Why is my hash / salt technique for storing passwords not working?为什么我用于存储密码的哈希/盐技术不起作用?
【发布时间】:2013-08-07 22:50:07
【问题描述】:

我正在尝试创建一个安全、自定义的用户登录系统,但它目前无法正常工作。这个想法是创建一个具有安全、加密密码的用户。但是,当使用正确的密码时,它不会登录到该站点。

使用密码123456789jp时的输出:

$6$j7Rd68RhKNx.6ccH$9lvRDdks.jx4hk7.YQ0hpvzPE22h/BZQ/9yXiwTMBV1Kx2xr2gbIZZJxYjeLrA41nL2WGjmt.FMQi877uOXrP1

相关功能:

// function register_user()
function bruger_opret_siden(){
            if ($stmt = $this->mysqli->prepare('SELECT NULL FROM `bruger` WHERE `brugernavn` = ?'))
            {
                $stmt->bind_param('s', $brugernavn);
                $brugernavn = $_POST["brugernavn"];
                $stmt->execute();
                $stmt->store_result();
                $count = $stmt->num_rows;
                $stmt->close();
                if($count > 0)
                {
                    $user_found = 1;
                }
            }
            if(!isset($user_found))
            {
                //Check if the user exists.

                if(!isset($errors))
                {
                    $pb = null;

                    include 'function/class.upload.php';
                    $handle = new Upload($_FILES["file"]);

                    if($handle->uploaded)
                    {
                        //trims to next request         
                    }

                 $password = $_POST["pass"];
                 $algorithm = '$6$'; //<--- This means the SHA 512
                 $salt = $this->generateSalt(16); //<--- SHA 512 uses a 16-character salt

                 $hash = crypt($password, $algorithm . $salt);

                if ($stmt = $this->mysqli->prepare('INSERT INTO `bruger` 
                (`rank`, `email`, `brugernavn`, `password`, `profilbillede`, `profilbillede_godkendt`, `navn`, `efternavn`, `alder_d`, `alder_m`, `alder_aar`, `status`, `kon`, `seksualitet`, `land_by`, `hojde`) 
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'))
                {

                    $stmt->bind_param('issssisssssiiisi', $rank, $email, $brugernavn, $password, $profilbillede, $pb_godkendt, $navn, $efternavn, $alder_d, $alder_m, $alder_aar, $kon, $seksualitet, $partnerstatus, $land_by, $hojde);
                    $rank = '1';
                    $pb_godkendt = '1';
                    $email = $_POST["email"];
                    $brugernavn = $_POST["brugernavn"];//C
                    $password = $hash;//C
                    $profilbillede = $pb;//C
                    $navn = $_POST["navn"];
                    $efternavn = $_POST["efternavn"];
                    $alder_d = $_POST["alder_d"];
                    $alder_m = $_POST["alder_m"];
                    $alder_aar = $_POST["alder_aar"];
                    $kon = $_POST["kon"];
                    $seksualitet = $_POST["seksualitet"];
                    $partnerstatus = $_POST["partnerstatus"];
                    $land_by = $_POST["land_by"];
                    $hojde = $_POST["hojde"];

                    $stmt->execute();
                    $stmt->close();

                    echo "ok";

                    }
                    else
                    {
                        // There was an error 
                        echo 'error: ' . $mysqli->error;
                    }
                }
            }
            else
            {
                echo "<li id=\"check_not\">Dette brugernavn er optaget!!</li>";
            }
    }

从密码和盐中生成哈希以注册用户的代码:

function generateSalt($length) {
         $alphabet = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
         $alphabet_length = strlen($alphabet);
         $salt = '';
         for ($i = 0; $i < $length; $i++) {
             $salt .= $alphabet[rand(0, $alphabet_length - 1)];
         }
         return $salt;
     }

两个显示用户信息的功能。

$pass = $mebe->generateSalt();
                $users = $mebe->bruger_opret_siden();

以下函数包含问题;它不会让用户登录。虽然没有产生错误,但它不起作用。

function godkendt_login()
    {
        if ($stmt = $this->mysqli->prepare("SELECT `id`, `brugernavn`, `rank`, `profilbillede`, `profilbillede_godkendt` FROM `bruger` WHERE `brugernavn` = ? AND `password` = ?"))
        {
            $stmt->bind_param('ss', $brugernavn, $password);
            $brugernavn = $_POST["brugernavn"];
            $password = sha1($_POST["pass"]);
            $stmt->execute();
            $stmt->store_result();
            $stmt->bind_result($id, $brugernavn, $rank, $profilbillede, $profilbillede_godkendt);
            $stmt->fetch();
            $count = $stmt->num_rows;
            $stmt->close();

            if($count > 0)
            {
                $_SESSION["logged_in"] = true;
                $_SESSION["id"] = $id;
                $_SESSION["profilbillede"] = $profilbillede;
                $_SESSION["brugernavn"] = $brugernavn;
                $_SESSION["rank"] = $rank;
                $_SESSION["profilbillede_godkendt"] = $profilbillede_godkendt;

                if($_SESSION["logged_in"] == true)
                {
                    echo "ok";
                }
                else
                {
                    // Sorry, please try again.
                                    echo "Desværre prøve igen."
                }
            }
            else
            {
                          echo "Skrive et password eller brugernavn"
            }
        }
    }

日志文件/inc文件:

<?php
    /*
     * // Grant the administrative privilige to show the content.
     * Giver admin adgang til se indhold på siden.
     */
    if(isset($_SESSION["rank"]) && $_SESSION["rank"] > 0) {
        $bruger = $mebe->brugerindhold_side();
    }


    /*
     * // Grant normal access to the page.
     * Hvis ingen af dem så få de bare adgang sådan her..
     */
    else{
    ?>
<form name="login" method="post" action="#">
    <h1>Log ind</h1>
    <p>Brugernavn</p><input type="text" name="brugernavn"/>
    <p>Password</p><input type="password" name="pass"/>
    <br />
    <input type="submit" name="Log_ind" value="Log ind" id="login">
    <?php
    if(isset($_POST["Log_ind"]))
    {
    $login = $mebe->godkendt_login();
    }
    ?>
</form>
<?php
    }
?>

【问题讨论】:

    标签: php hash mysqli salt


    【解决方案1】:

    好的,由于语言差异,我无法完全掌握您的代码。 盐应该是可重复的值。从我收集到的内容看来,您的似乎是由@random 生成的。

    如果是这样,哈希不会相加,因此检查失败。 为哈希使用一个常量值,并且不要将其存储在数据库中

    例如:

    <?php
    
         function generateHash($in)
         {
             $salt = "Th1s1sAS4lt";
             return md5(sha1($in) . $salt);
         }
    ?>
    

    此外,任何帖子值都应检查,因为它是由用户输入的,可能包含非法字符或有害代码。请注意以下几点:

    <?php
        // Note that the input contains SQL.
        // bemærke, at de input indeholder SQL.                 
        $_POST['passwd'] = "'p@ssword' OR 'a' = 'a'";
    
        if (tilmeld_dig())
        {
            // Log the user in.
            // brugeren er logget på
        }
    
    
        function tilmeld_dig()
        {
            $sql = "SELECT brugernavn from tbl_brugere WHERE adgangskode = " . $_POST['passwd'];
    
                // Execute the database command. 
            $res// = Database kommando udføre
            if ($res)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    ?>
    

    在上面的示例中,无论密码如何,用户都已登录,因为注入的 SQL 命令将始终为真。

    虽然这是一个粗略的示例,但请查看以下内容: http://translate.google.com/translate?hl=nl&sl=en&tl=da&prev=_dd&u=http%3A%2F%2Fwww.unixwiz.net%2Ftechtips%2Fsql-injection.html

    我试图用一些丹麦语评论来支持你,因为这在安全系统中很重要。你在正确的轨道上,但我建议你看看我的建议。

    此外,这是未经测试的代码,但或多或​​少是如何工作的。

    【讨论】:

    • 您的问题现在解决了吗?这似乎是代码的a 问题,但我不确定它是否解决了您的问题。
    • 另外,我确实怀疑你在保护有关外星生命的信息,因为那是一个地狱般的密码! ;)
    • 现在松了 :) 我就是这样绑带的; $password = sha1('ri629' . $_POST["pass"] . 'h1ry6328');
    • 好的,你是直接用post值吗?因为这会在安全方面留下一个大漏洞。我建议处理发布的值,在使用之前检查它的正确值。
    • 我不太明白你的意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2016-09-17
    • 2012-01-08
    • 2012-11-07
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多