【问题标题】:Encrypting gives error for invalid key size [duplicate]加密导致无效密钥大小错误[重复]
【发布时间】:2019-03-24 14:48:39
【问题描述】:

我正在创建一个随机密钥,然后我想用一个好的算法对其进行加密,然后我想用这个加密的密钥加密数据。我的代码是:

$iv=16; //128bits
$datakey = base64_encode(openssl_random_pseudo_bytes($iv,$strong));
$datakey = md5($datakey);
$finaldata= mcrypt_encrypt(MCRYPT_BLOWFISH, $datakey, $stringtobeencoded, MCRYPT_MODE_CFB);

错误:

加密模式需要一个大小为 8 的初始化向量

如何完成我的要求?

【问题讨论】:

    标签: php security encryption mcrypt


    【解决方案1】:

    我想用一个好的算法来加密它

    您在问题中包含的 sn-p 不安全。我强烈推荐:

    1. Don't use mcrypt
    2. Refer to the example code in this linked answer for how to encrypt securely

    但是你得到的错误是 Blowfish-CFB 需要一个密钥和一个 IV,而你只提供了一个密钥。

    【讨论】:

      【解决方案2】:

      你的例子有很多事情要做,因为 mcrypt_* 已被弃用,这个例子使用 openssl_* 函数代替。要跳过 IV 创建(不太安全但更容易),请使用以下命令:

      $plainText = 'Hello world';
      $key  = 'my-secret-encrpytion-key';
      $algo = 'BF-CFB'; // blowfish cfb
      
      $cypherText = openssl_encrypt($plainText, $algo, $key);
      echo base64_encode($cypherText); // ZTVtdWNMRUp5N1dwZ2NFPQ==
      
      echo openssl_decrypt($cypherText, $algo, $key);
      

      对于更完整的实现,包括生成 $iv,就像您在原始问题中尝试做的那样,以下代码将起作用:

      $plainText = 'Hello world';
      $key  = 'my-secret-encrpytion-key';
      $algo = 'BF-CFB'; // blowfish cfb
      
      $ivLen = openssl_cipher_iv_length($algo); // $ivLen = 8
      $iv = openssl_random_pseudo_bytes($ivLen);
      $cypherText = openssl_encrypt($plainText, $algo, $key, 0, $iv);
      
      echo base64_encode($cypherText); // V3JtL1crWHZKL1lEeGJBPQ==
      
      echo openssl_decrypt($cypherText, $algo, $key, 0, $iv);
      

      已对此进行了编辑以更正不正确的变量名称。

      【讨论】:

      • 嗨,这里的 $cipher 是什么?它的价值从何而来?
      • 它说:警告:openssl_encrypt():使用空的初始化向量 (iv) 可能不安全,不建议在 .... 如何避免这种情况?
      • 对不起,应该是$algo;您的系统支持的可用算法之一,请参阅openssl_get_cipher_methods()中的可能值
      • 使用第二个代码示例消除空初始化向量消息。
      • 但是第二种方法的问题是每次执行操作时都会生成一个随机IV。我必须将 IV 存储在普通黑客也可以读取的数据库/文件/注册表中。所以我想在使用它们加密数据之前加密密钥和 IV。有什么想法吗?
      【解决方案3】:

      实际的错误——Encryption mode requires an initialization vector of size 8——不是无效的密钥大小,而是缺少 IV。

      CFB mode 需要一个 IV(初始化向量)。 IV 大小通常与块大小相同,Blowfish 为 64 位,AES 为 128 位。

      通常最好不要使用 Blowfish 进行加密,即使它的作者现在也使用 AES。

      当保存密码验证器时,仅使用哈希函数是不够的,并且仅添加盐对提高安全性无济于事。而是使用随机盐迭代 HMAC 约 100 毫秒的持续时间,然后将盐与哈希一起保存。最好使用PBKDF2Rfc2898DeriveBytesArgon2password_hashBcrypt 等函数或类似函数。使用 PHP 使用 password_hashpassword_verify,这对是安全且易于使用的。 关键是让攻击者花费大量时间通过蛮力寻找密码。

      最好不要使用 PHP mcrypt,它是废弃软件,多年未更新,不支持标准 PKCS#7 (née PKCS#5) 填充,只有非标准的空填充,甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。不推荐使用的 mcrypt 扩展在 PHP 7.2 中被删除。而是考虑使用defuseRNCryptor,它们提供了一个完整的解决方案并且正在维护并且是正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        相关资源
        最近更新 更多