mcrypt在Windows / IIS

时间:2015-09-08 01:23:38

标签: php iis encryption mcrypt encryption-symmetric

我已经在我的php应用程序中大量使用mcrypt多年了,无论是在win / IIS还是在linux上。虽然我在我的linux服务器上运行PHP 5.4.28,但我刚刚在Windows 8.1 IIS框中升级到PHP 5.6.11。并且mcrypt不再有效。它不会抛出我能看到的任何错误;它只是不起作用。这是我的加密功能:

function Encrypt($text){ 
    global $salt;
    if($text != "")
        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));  
    else
        return "";
}   

这在我的linux服务器上工作正常,但在我的本地Windows框中返回空白。根据我的阅读,mcrypt内置于php 5.6 for windows中,因此不应该使用扩展或ini文件。

我错过了什么?

3 个答案:

答案 0 :(得分:8)

让我们一块一块地看看你的代码。 (主要是化妆品/空白变化。)

function Encrypt($text)
{
    global $salt; // Why not make this a second parameter?
    if($text != "") { // An unusual check, for sure
        return trim( // base64_encode doesn't leave whitespace
            base64_encode(
                mcrypt_encrypt(
                    MCRYPT_RIJNDAEL_256, // This is a non-standard variant of the
                                         // Rijndael cipher. You want to use the
                                         // MCRYPT_RIJNDAEL_128 constant if you
                                         // wanted to use AES here.
                    $salt, // This is a key, not a salt!
                    $text,
                    MCRYPT_MODE_ECB, // ECB mode is the worst mode to use for
                                     // cryptography. Among other reasons, it
                                     // doesn't even use the IV. Search for 
                                     // ECB penguins for an idea of why ECB
                                     // mode is such a bad idea.
                    mcrypt_create_iv(
                        mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
                        MCRYPT_RAND // You're using ECB mode so this is a waste
                                    // anyway, but you should use
                                    // MCRYPT_DEV_URANDOM instead of MCRYPT_RAND
                    )
                )
            )
        );  
    }
    return "";
}

我强烈建议您不要将此功能用于任何事情。它不安全。 Don't use ECB mode

此外,unauthenticated encryption is dangerouslibmcrypt is abandonware

答案 1 :(得分:5)

PHP 5.6的加密要求比5.4强。在5.6中你会得到这个警告,这实际上是一个错误,因为它实际上导致加密和解密失败:

  

警告:mcrypt_encrypt():此算法不支持xx大小的密钥。仅支持尺寸为16,24或32的按键。

...其中“xx”是盐值的长度。因此,salt值必须精确为16个,24个或32个字符。

答案 2 :(得分:0)

正如SweatCoder之前所说,MCRYPT_RIJNDAEL_256的密钥必须长度为32.要继续使用小于32的旧密钥(此处称为$ oldkey),请使用

$key = str_pad($oldkey, 32, chr(0));

($ key就是你所谓的$ salt)