好吧,我正在尝试将文件上传到服务器时加密。我在stackoverflow上找到了代码here,但是我在插入它时遇到了问题。我收到错误unexpected '(', expecting ',' or ';' in where/the/file/is.php
。它指向const KEY = md5('somesecretcode');
行。我知道它说它会在md5
之后期待结束,但我不确定为什么?您认为它会接受现在“加密”的字符串作为有效字符串。如果需要,我会上传更多代码。感谢您的帮助!我对此有点新意,所以请不要太粗暴。
这是代码
<?php
class Encryption
{
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE = MCRYPT_MODE_CBC;
const KEY = md5('somesecretcode');
public function encrypt($plaintext)
{
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, self::KEY, $iv);
$crypttext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
return base64_encode($iv.$crypttext);
}
public function decrypt($crypttext)
{
$crypttext = base64_decode($crypttext);
$plaintext = '';
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($crypttext, 0, $ivsize);
$crypttext = substr($crypttext, $ivsize);
if ($iv)
{
mcrypt_generic_init($td, self::KEY, $iv);
$plaintext = mdecrypt_generic($td, $crypttext);
}
return trim($plaintext);
}
}
?>
我称之为......
$encrypted_string = Encryption::encrypt('this is a test'); // Åž-\Ž“kcþ1ÿ4gî:Xƒã%
$decrypted_string = Encryption::decrypt($encrypted_string); // this is a test
答案 0 :(得分:6)
您不能将函数调用或数组与const
一起使用。您将不得不找到另一种设置常量的方法(或者只是硬编码md5('somesecretcode')
的值)。
答案 1 :(得分:2)
你不能使用&#34; const&#34;,因为这会在编译时被解析,而函数调用是不可能的。
你可以像这样使用define函数
define('KEY', md5('somesecretcode'));
这是一个函数,在运行时执行并且可以工作。您必须将它放在可以执行的地方 - 例如类构造函数。
但是在这个上下文中使用define并不是一个非常好的设计,因为然后创建一个类的实例会将一些东西写入全局(或命名空间)范围。
所以你需要重新考虑你的解决方案。如果你坚持保持静态方法调用,可能会将秘密传递给函数作为输入参数?
答案 2 :(得分:1)
您不应该使用函数在const
之外初始化constructor
变量
你可以这样做:
class Encryption
{
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE = MCRYPT_MODE_CBC;
const KEY = '';
public function __construct(){
$this->KEY = md5('somesecretphrase');
}
...
<强>更新强>:
这不是正确的!
即使这个代码似乎正在工作,它真正做的是创建另一个名为KEY
的对象成员(即使它没有$
- 这有点令人困惑)并为其分配{{ 1}}。该成员不是常量,可以随时更改。
md5('somesecretphrase')
可以引用的班级成员KEY
仍为空!