标签: crypt

为什么crypt/blowfish使用两种不同的盐生成相同的哈希?

这个问题与PHP的实现有关crypt().对于这个问题,盐的前7个字符不计算,所以盐' $2a$07$a'的长度为1,因为它只有盐的1个字符和元数据的7个字符.

当使用长度超过22个字符的salt字符串时,生成的哈希值没有变化(即截断),当使用短于21个字符的字符串时,盐将自动填充($显然有' '字符); 这是相当简单的.但是,如果给出20个字符的盐和21个字符的盐,除了21个长度的盐的最终字符外两个是相同的,两个散列字符串都是相同的.一个长22个字符的盐,除了最后一个字符外,它与21个长度的盐相同,哈希值会再次不同.

代码示例:

$foo = 'bar';
$salt_xx = '$2a$07$';
$salt_19 = $salt_xx . 'b1b2ee48991281a439d';
$salt_20 = $salt_19 . 'a';
$salt_21 = $salt_20 . '2';
$salt_22 = $salt_21 . 'b';

var_dump(
    crypt($foo, $salt_19), 
    crypt($foo, $salt_20), 
    crypt($foo, $salt_21), 
    crypt($foo, $salt_22)
);
Run Code Online (Sandbox Code Playgroud)

会产生:

string(60) "$2a$07$b1b2ee48991281a439d$$.dEUdhUoQXVqUieLTCp0cFVolhFcbuNi"
string(60) "$2a$07$b1b2ee48991281a439da$.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2O4AH0.y/AsOuzMpI.f4sBs8E2hQjPUQq"
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

编辑:

一些用户注意到整个字符串存在差异,这是正确的.在salt_20,偏移(28,4)是da$.,而在salt_21,偏移(28,4)是da2.; 但是,重要的是要注意生成的字符串包括散列,盐,以及生成盐的指令(即$2a$07$); 实际上,差异发生的部分仍然是盐.实际哈希值不变UxGYN739wLkV5PGoR1XA4EvNVPjwylG.

因此,这实际上并不是产生的散列的差异,而是用于存储散列的盐的差异,这恰恰是手头的问题:两个盐生成相同的散列.

Rembmer:输出将采用以下格式:

"$2a$##$saltsaltsaltsaltsaltsaHASHhashHASHhashHASHhashHASHhash"
//                            ^ Hash Starts …
Run Code Online (Sandbox Code Playgroud)

php hash crypt blowfish salt

30
推荐指数
2
解决办法
1万
查看次数

如何使用PHP中的Blowfish创建和存储密码哈希

1)如何使用crypt()创建安全的Blowfish哈希密码?

$hash = crypt('somePassword', '$2a$07$nGYCCmhrzjrgdcxjH$');
Run Code Online (Sandbox Code Playgroud)

1a)"$ 2a"的意义是什么?它只是表明应该使用Blowfish算法吗?
1b)"07美元"有什么意义?更高的值意味着更安全的哈希吗?
1c)"$ nGYCCmhrzjrgdcxjH $"有什么意义?这是将要使用的盐吗?这应该随机生成吗?硬编码?

2)你如何存储河豚的哈希?

echo $hash;
//Output: $2a$07$nGYCCmhrzjrgdcxjH$$$$.xLJMTJxaRa12DnhpAJmKQw.NXXZHgyq
Run Code Online (Sandbox Code Playgroud)

2a)这应该存储在数据库中的哪一部分?
2b)列应该使用什么数据类型(MySQL)?

3)如何验证登录尝试?

php security passwords crypt blowfish

27
推荐指数
1
解决办法
3万
查看次数

给定linux用户名和密码,如何测试它是否是有效帐户?

所以我的问题是直接给出一个linux用户名和密码如何测试它是否是一个有效的帐户?

linux passwords hash crypt username

19
推荐指数
1
解决办法
4万
查看次数

密码散列有什么用?有什么理由不使用jBCrypt?

我打算在新的Web应用程序中使用jBCrypt进行密码散列,因为它应该是我读过的最好的.因为我在调查之前没有使用它,是否有任何理由不使用它.

我有这个:

  • 我没有在Maven存储库中找到它(在mvnrepository.org搜索jbcrypt和bcrypt),这是一个沮丧,因为我希望尽可能使用Maven存储库管理我的依赖项.如果jBCrypt是密码散列的最佳解决方案,我必须设置我自己的本地存储库并以这种方式提供它.或者我错过了吗?也许它在某处?
  • 它仅在版本0.2,但也许它是稳定的,并且版本号低的原因还有其他原因?

java hash crypt bcrypt jbcrypt

17
推荐指数
1
解决办法
5283
查看次数

密码哈希密码.Blowfish产生奇怪的输出

我在理解php的crypt函数方面有点麻烦.我的PHP版本是5.4.7.

我想使用crypt在数据库中存储salted密码,因为据我所知,使用md5哈希密码的开发人员将在现场进行赌注和烧毁.

我想使用blowfish alg来生成哈希.现在,根据php文档,如果用"$ 2y $"+成本(例如:"08")+"$"+ 22个字符盐(./0-9A-Za-z)调用它,则crypt使用blowfish .但是,这一点测试代码的输出让我很困惑:

echo "<pre>";
if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish SaltLen = 18:     ' . crypt('string that should be hashed', '$2y$08$123456789012345678') . "\n";
    echo 'Blowfish SaltLen = 19:     ' . crypt('string that should be hashed', '$2y$08$1234567890123456789') . "\n";
    echo 'Blowfish SaltLen = 20:     ' . crypt('string that should be hashed', '$2y$08$12345678901234567890') . "\n";
    echo 'Blowfish SaltLen = 21:     ' . crypt('string that should be hashed', '$2y$08$123456789012345678901') . "\n";
    echo 'Blowfish SaltLen = 22: …
Run Code Online (Sandbox Code Playgroud)

php passwords crypt blowfish password-hash

17
推荐指数
1
解决办法
3811
查看次数

用于检查哈希等式的strcmp vs. == vs. ===在PHP中

我正在使用crypt()PHP中的密码哈希,并且我正在尝试在执行密码检查时找出最安全的方法来测试生成的哈希的相等性.

我可以看到三个选项:

选项1 - 双等于

function checkPassword($hash, $password)
{
    return crypt($password, $hash) == $hash;
}
Run Code Online (Sandbox Code Playgroud)

选项2 - 三等于

function checkPassword($hash, $password)
{
    return crypt($password, $hash) === $hash;
}
Run Code Online (Sandbox Code Playgroud)

备选案文3 - strcmp()

function checkPassword($hash, $password)
{
    return strcmp(crypt($password, $hash), $hash) === 0;
}
Run Code Online (Sandbox Code Playgroud)

我的直觉告诉我,由于缺乏类型检查,选项1是一个坏主意,选项2或3可能更好.但是,如果有特定情况===或者strcmp会失败,我就无法解决.哪个是最安全的?

php security string crypt bcrypt

16
推荐指数
2
解决办法
8764
查看次数

BCrypt中使用2x前缀?

问题是同一个标题,BCrypt使用$ 2x $?

以下情况是对的吗?

$2a$当服务器PHP版本更早时,我们有一组已经使用前缀进行哈希处理的密码5.3.7.现在我们将PHP升级到5.3.7+,现在我们必须先用$2x$算法验证以前的密码然后用$2y$前缀重新密码.那就对了?

php crypt bcrypt

16
推荐指数
1
解决办法
8208
查看次数

使用PHP的crypt的河豚盐的正确格式是什么?

我已经阅读了PHP手册输入中crypt()提供的信息,但我发现自己仍然不确定触发Blowfish算法的salt的格式.

根据手动输入,我应该使用'$ 2 $'或'$ 2a $'作为16个字符串的开头.然而,在以后的例子中,他们使用更长的字符串:" $2a$07$usesomesillystringforsalt$",这表明,我认为任何字符串我提供将切片和切块以适应模型.

我遇到的问题实际上是触发河豚算法中VS STD_DES.例:

$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt); 
// $hash = $26HdMTpoODt6
Run Code Online (Sandbox Code Playgroud)

那哈希显然不是漩涡,事实上STD_DES只有盐的前两个字符用于盐.但是,在PHP手册的例子中,他们的盐以' $2a$07$' 开头,所以如果我将这三个字符添加到相同的代码中,我得到以下内容:

$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt); 
// $hash = $2a$07$b1b2ee48991281a439da2OHi1vZF8Z2zIA.8njYZKR.9iBehxLoIC
Run Code Online (Sandbox Code Playgroud)

我发现我可以提供在此处显示为"人物存在一些差异07$",例如04$15$两个工作,但01$通过03$不工作(生成一个空字符串),和值等99$,并85$ …

php hash crypt blowfish salt

15
推荐指数
1
解决办法
8627
查看次数

hash()与crypt()函数比较

我目前正在实施登录系统.我想将密码和salt存储在数据库中.现在我发现有一个hash()和一个crypt()函数似乎做同样的事情(对SHA512有效).

hash()是更新的,似乎支持更多的哈希算法比crypt().还是我应该知道/关心的其他差异?

编辑:

function generatePasswordHash($password){
    $salt = base64_encode(mcrypt_create_iv(8));
    $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$');

    return $calculatedPasswordHash;
}
Run Code Online (Sandbox Code Playgroud)

结果看起来像 $1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.

这是我的密码检查功能:

function checkLoginData($username, $password){
    global $db;

    $sql = "SELECT * FROM users WHERE username = :username";
    $result = $db->ExecuteQuery($sql, array("username"=>$username));

    if(!empty($result)){
        $result = $result[0];
        $savedPasswordHash = $result['password'];
        $splitted = explode("$", $savedPasswordHash);
        $salt = $splitted[2];
        $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$');

        if($savedPasswordHash === $calculatedPasswordHash){
            return true;
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

php encryption hash crypt

13
推荐指数
1
解决办法
9836
查看次数

哪种哈希算法提供最长的输出?

我很好奇PHP的crypt函数可以使用哪种哈希方法提供最长的输出,而且,如果输出的长度相对于两个哈希冲突的可能性.

php hash crypt

13
推荐指数
1
解决办法
1万
查看次数