mcrypt没有';在windows/IIS上不能使用PHP5.6

mcrypt没有';在windows/IIS上不能使用PHP5.6,php,iis,encryption,mcrypt,encryption-symmetric,Php,Iis,Encryption,Mcrypt,Encryption Symmetric,多年来,我一直在我的php应用程序中大量使用mcrypt,无论是在win/IIS还是linux上。虽然我在linux服务器上运行PHP5.4.28,但我刚刚在Windows8.1IIS上升级到PHP5.6.11。mcrypt也不再工作了。它不会抛出任何我能看到的错误;它就是不起作用。这是我的加密功能: function Encrypt($text){ global $salt; if($text != "") return trim(base64_encode(

多年来,我一直在我的php应用程序中大量使用mcrypt,无论是在win/IIS还是linux上。虽然我在linux服务器上运行PHP5.4.28,但我刚刚在Windows8.1IIS上升级到PHP5.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内置于PHP5.6 for windows中,因此不应篡改扩展名或ini文件


我遗漏了什么?

我没有答案,但这是一个很长的评论

它不会抛出任何我能看到的错误

您是否测试了配置,以验证在出现错误时是否可以看到错误

但在“我的本地windows”框中返回空白

如果它返回,则不会导致致命错误。因此定义了mcrypt函数。您是否检查过常量是否已定义?您是否检查了libmcrypt的版本是否符合PHP扩展要求

您是否检查了mcrypt_*()函数的输入是否合理

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))));  

即使上述方法有效,这也是一段可怕的代码。编写代码和使用高级语言的原因不是为了让您的计算机能够理解它们,而是为了让人类能够理解代码:

$iv=mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$encypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB
               , $iv, MCRYPT_RAND); 
$encoded=base64_encode($encrypted);
return $encoded;

(这样布置代码也可以简化注入检查、断点和其他调试措施)

PHP5.6比5.4有更强的加密要求。在5.6中,您将得到此警告,这实际上是一个错误,因为它实际上会导致加密和解密失败:

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


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

让我们逐段查看您的代码。(主要是外观/空白更改。)

我强烈建议您不要将此函数用于任何用途。它不安全


此外,而且。

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


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

mcrypt不使用
/dev/uradom
?在Windows8上用PHP5.6.12测试,它可以工作。。。它不能像您的
$text
为空那样简单吗?试图
var\u dump($text)
?我希望您认识到
Encrypt
函数是多么不安全。请注意,通过将所有调用链接在一起,您失去了调试的能力,无法找到错误发生的位置。这也很难重新阅读和理解。您还将各种操作合并在一起。考虑使用具有短寿命变量的多语句。编写代码和使用高级语言的原因不是为了让你的计算机能够理解它们,而是为了让人类能够理解代码“==今天的引用。Scott,如果你能根据你的所有建议给我一个工作示例,我将奖励你,如果你在乎的话。是的,很简单。使用而不是编写您自己的.Hmmm…使用包含的encr libs w/php并不完全是编写我自己的。另外,我的网络应用程序不是银行或国家安全…只是体育裁判检查他们的日程安排。你不是在写你自己的原语,而是在写你自己的协议,这同样危险。我曾经写过我自己的加密算法。它是基于ASCII替换的,太原始了,太俗气了。然而,没有人能破解它。几位经验丰富的加密专家尝试过。我把它放在加密论坛上。没有人能碰它,即使在我用解密的纯文本提供了加密示例之后。这种“危险的”加密方法论、容易被破解等等的说法完全是胡说八道——除非是像NSA这样的人在做破解。
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 "";
}
$key = str_pad($oldkey, 32, chr(0));