【问题标题】:crypt function PHP showing the salt in plain formcrypt 函数 PHP 以普通形式显示盐
【发布时间】:2020-07-15 09:41:24
【问题描述】:

我正在使用 crypt 函数从字符串创建散列,但是当使用 salt 参数时,它以普通形式显示 salt 参数,我知道 salt 参数是可选的,我们可以排除它,但是制作方法是什么盐不会在散列字符串中以普通形式显示。 示例代码

echo crypt('something','$5$rounds=5000$anexamplestring$');

这段代码的输出是

$5$rounds=5000$anexamplestring$YuRqx9rDLGE1wLc9Bp01/DetFvo6S7Bphn6TgGViCD8

这里输出的起始字符串与看起来很尴尬的 crypt 函数相同,有没有办法解决这个问题,或者这是默认行为?

【问题讨论】:

  • 当然这是默认行为。下次要针对存储的哈希验证原始文本值,使用的盐需要再次可用,否则一开始就不起作用。
  • en.wikipedia.org/wiki/…: “密码散列需要使用一个大的随机、非秘密盐值,可以与密码散列一起存储。 salt 将密码哈希的输出随机化,使攻击者无法存储密码表和可与密码哈希摘要进行比较的预计算哈希值。”

标签: php encryption cryptography


【解决方案1】:

在你的情况下,你不能在没有盐的情况下解密它,它将在哈希中。

如果你需要加密一些东西,我会这样做,然后你需要 openssl 并且字符串可以很长,但是每次一个新的并且没有密钥你不能拿起它。

function get_encrypt($str = false, $key = false)
{
    if (!is_string($str)) {
        return false;
    }

    $key = !empty($key) ?: 'b7^FV7867&f)vd6567';

    $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext_raw = openssl_encrypt($str, $cipher, $key, $options = OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary = true);
    $encrypttext = base64_encode($iv . $hmac . $ciphertext_raw);

    return ($encrypttext);
}


function get_decrypt($str = false, $key = false)
{
    $key = !empty($key) ?: 'b7^FV7867&f)vd6567';

    $c = base64_decode($str);
    $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
    $iv = substr($c, 0, $ivlen);
    $hmac = substr($c, $ivlen, $sha2len = 32);
    $ciphertext_raw = substr($c, $ivlen + $sha2len);
    $decrypttext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options = OPENSSL_RAW_DATA, $iv);
    $calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary = true);
    if (hash_equals($hmac, $calcmac)) {
        return ($decrypttext);
    } else {
        return false;
    }
}

$str = get_encrypt('something'); // out: ccxCvYCQrsCDC8LA1jrxh3OP38KzLXk5NLxIaSH2W7oDsqUSi3gsmZBq8hnVwuAfCZwt3M1lJhHjFAArHXlrcA==

get_decrypt($str); // out: something

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2013-08-27
  • 1970-01-01
  • 2012-05-02
  • 2012-06-29
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多