English 中文(简体)
我在PHP中正确使用 CRYPT_BLOWISH吗?
原标题:Am I using CRYPT_BLOWFISH correctly in PHP?
  • 时间:2012-05-20 02:13:30
  •  标签:
  • php
  • blowfish

我正要用这个来做一个用户密码系统 但我首先想确保我做对了。这是我的测试代码:

function generateBlowfishSalt() {
    $chars =  0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./ ;
    $numChars = strlen($chars);
    $salt =   ;

    for($i = 0; $i < 22; ++$i) {
        $salt .= $chars[mt_rand(0, $numChars - 1)];
    }

    return $salt;
}

$password =  foo ;
$salt = generateBlowfishSalt();
$hash1 = crypt($password,  $2a$12$  . $salt);
$hash2 = crypt($password, $hash1);
$compare = ($hash1 == $hash2);

printf( password: %s</br> , $password);
printf( salt: %s</br> , $salt);
printf( hash1: %s</br> , $hash1);
printf( hash2: %s</br> , $hash2);
printf( compare:   . $compare);

以下是一个样本输出 :

password: foo
salt: MYVJ32OqLcMGBar3pUa.0S
hash1: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q
hash2: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q
compare: 1

我的主要问题是:

  1. 我是否正确地生成了22个字符盐?一些我见过的用 base64_encode () 生成盐的功能。 我需要这样做吗?

  2. 在数据库中存储整个 $hash1 值而不另存一个盐值是否正确,因为 $hash1 将含盐,而我只需要核实密码?

  3. 在PHP crypt () 文档页面上, CRYPT_BLOWISH 示例有一个盐参数尾注 $ <$ < < acode> <$ < < < $/code>> < < code> < $ < /code> < < code> < $ < /code> < < $ > < code> < acode> < $ < $2a$07$ use somesislystrting foralt$ 。但在所有这些例子中,我从未看到任何人使用尾注 <$ 。

谢谢 谢谢

问题回答

您正在正确使用盐。 必须是随机的。 随机生成盐的方法有很多不同。 一些人使用它, 除了日期时间等等。 另外, 更长的盐量并不代表它会被切除。 它需要一定的长度, 至少在加密方面( ) 。 因此, 如果多加一点垫子让你感觉更好的话, 请去做 。

您想把盐储存在数据库中。 我一开始很难理解这一点。 盐的整个点只是让彩虹桌上的密码花更长的时间, 并列出大量可能的密码。 此外, 校正还有助于使用2个或2个以上相同的密码, 这必然会发生。 如果是这样的话, 混血儿仍然会因随机盐类的不同而不同 。

至于加密 (), 继续测试它, 直到它看起来和 PHP 的php DOC 上的长度相同, 但看起来是正确的 。





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...