3

オンラインで調べて助けを求めた後、sha2ログインフォームを作成しています。以下のリンクのサンプルコードは非常に便利で実用的です(私が正しいことを願っています!??)、私が理解していない唯一のことこれは、このプログラマーが関数を記述し、関数からソルト値を取得する方法です。

http://hungred.com/useful-information/php-better-hashing-password/

define('SALT_LENGTH', 15);

function HashMe($phrase, &$salt = null)
{
    $pepper = '!@#$%^&*()_+=-{}][;";/?<>.,';

    if ($salt == '')
    {
        $salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }

    return hash('sha512',$salt . $pepper .  $phrase);
}

関数をこれに変更した場合の違いは何ですか?

function HashMe($phrase, $salt)  {..}

もちろん、この関数は失敗します。$ saltの前に「&」を付けるのはどういう意味ですか?この&$ salt = nullのように'null'を設定する必要がありますか?'&$ salt'を入れたらどうなりますか?

次に、salt値を取得するには、それをまっすぐに取得して、以下のようにsqlクエリを実行します。

$username = cleanMe($_POST('username'));
$password = cleanMe($_POST('password'));
$salt = '';
$hashed_password = HashMe($password, $salt);
$sqlquery = 'INSERT INTO  `usertable` ("username", "password", "salt") VALUES  ("'.$username.'", "'.$hashed_password .'", "'.$salt.'") WHERE 1';
..

SQLクエリを準備する前に、次のような関数からソルト値を取得するにはどうすればよいですか?

$salt = "'".salt."'";
$username = "'".$username."'";
$hashed_password = "'".$hashed_password."'";

それから、

$sqlquery = 'INSERT INTO  `usertable` ("username", "password", "salt") VALUES  ($username, $hashed_password, $salt) WHERE 1';

私がこれを好まない/したくない理由-私のSQLクエリの"'"は、$ firstname='NULL'のようなnull値を持っているためです。そして、名が空/ nullの場合、行に空のフィールドをnullとして「チェック」させたいと思います。

さらに、SQLクエリに「'」が含まれているため、問題が発生したときにめまいがしてデバッグが困難になります...

申し訳ありませんが、このスレッドにはたくさんの質問があります!

ありがとう。

4

1 に答える 1

5

私があなたの質問に一度に一つ答えることができるかどうか見てみましょう。

function HashMe($phrase, $salt)最初に、失敗するのに失敗する理由を尋ねfunction HashMe($phrase,&$salt = null)ました。これは、パート2とパート3を説明した後で明らかになります。

$salt次に、関数宣言で&beforeが必要な理由を尋ねました。&の意味は、参照によって値を渡すことです。通常、関数に値を渡すと、その値のコピーが作成され、そのコピーで作業します。たとえば、次のようになります。

function addOne($number){
    $number = $number + 1;
}

$myNumber = 3;
addOne($myNumber);
echo $myNumber;

このコードは3、ではなくを出力します4。これは、関数が$ myNumberを変更せず、そのコピーを作成してそのコピーを変更するためです。参照を渡すときは、コピーを作成するのではなく、元の番号で機能するように指示します。したがって、このわずかな変更を行うと、次のようになります。

function addOne(&$number){
    $number = $number + 1;
}

$myNumber = 3;
addOne($myNumber);
echo $myNumber;

これで、コードが出力されます4。この関数は、$ saltの値を変更するため、参照によって$saltを渡します。したがって、関数が実行された後、$saltの新しい値が得られます。

なぜ必要なのかというと&$salt = null、自分で宣言しなければ、変数は自動的に宣言されます。したがって、ランダムハッシュを生成するだけの場合(使用されたソルトがわからないため、再作成する手段はありません)、を使用して関数を呼び出すことができますHashMe("message to hash");。つまり、= null2番目のパラメーターがない場合は、2番目のパラメーターを自動的に「null」に設定します。ただし、コードの後半では、2番目のパラメーターが「null」の場合、ランダムなソルトを生成すると示されています。

if ($salt == '')
{
    $salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
}

したがって、この方法で関数を呼び出すと、再現できない可能性のあるハッシュが作成されます。

4番目の質問では、SQLクエリで使用するために$saltの値を取得したいとしました。それが参照によるパスの美しさです。変数$saltは参照によって渡されたため、関数の実行後、$ saltを再度使用すると、新しい値になります。注意すべき重要な点の1つは、 $ saltを変更するためにすべての関数が行うことは、15文字の長さであることを確認することです。長いものは切り捨てられますが、短いものはそのまま残ります。このため、関数によって返される(15文字の)ソルトを格納すると、将来使用でき、ソルトが再度変更されることはありません。したがって、SQLクエリは完全に機能するはずです。

$sqlquery = "INSERT INTO  `usertable` ('username', 'password', 'salt') VALUES  ($username, $hashed_password, $salt) WHERE 1";

元のクエリから二重引用符と一重引用符を入れ替えたことに注意してください。これは、PHPの一部のバージョンでは、変数が一重引用符で解析されないためです。例えば:

$secret = "Hello, there";
echo '$secret'; // "$secret"
echo "$secret"; // "Hello, there"
于 2010-10-10T02:43:50.363 に答える