在函数内使用已定义的安全变量

时间:2013-02-09 07:03:28

标签: php mcrypt

我发现我不应该使用像global $auth_key这样的全局变量来处理敏感数据(如果不是这样的话,请纠正我。)因此我想使用已定义的变量来存储安全密钥。

定义内部config.php盐键。

define('AUTH_KEY','::~K~UC*[tlu4Eq/]Lm|h');

define('SECURE_AUTH_KEY', 'QsTMvbV+tuU{K26!]J2');

encryption.php中包含将在其中使用AUTH_KEYSECURE_AUTH_KEY的加密函数。

function encrypt_text($value) {
   if(!$value) return false;
   $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, **AUTH_KEY_HERE**, $value, MCRYPT_MODE_ECB, **SECURE_AUTH_KEY_HERE**);
   return trim(base64_encode($crypttext));
}

function decrypt_text($value) {
   if(!$value) return false;
   $crypttext = base64_decode($value);
   $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, **AUTH_KEY_HERE**, $crypttext, MCRYPT_MODE_ECB, **SECURE_AUTH_KEY_HERE**);
   return trim($decrypttext);
}

有办法吗?或您可以推荐的任何其他解决方案?请注意,这些密钥对于加密敏感信息非常重要。

另外,另一个问题是,在mcrypt上使用的密钥的最大长度是多少?

感谢您并期待您的回复。

5 个答案:

答案 0 :(得分:1)

作为一项规则:登录密钥,加密更强。其次,除非你的数据很短,否则不要使用ECB,你应该使用CBC或更强的东西。第三:使用salt或初始化向量。最后请阅读:https://www.owasp.org/index.php/Cryptographic_Storage_Cheat_Sheet

答案 1 :(得分:0)

使用constant就像使用变量一样,除了没有美元符号。

$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, AUTH_KEY, $value, MCRYPT_MODE_ECB, SECURE_AUTH);

与使用global关键字相比,此方法没有任何固有的安全性。虽然这种方法是首选。通过使用常量,您会说这是我将在整个应用程序中使用的静态值。另一方面,不得不使用global通常只是设计糟糕或懒惰的结果。它导致难以遵循的代码,滥用范围试图完成的内容。

密钥长度取决于使用的加密算法。 RTM。

答案 2 :(得分:0)

是的,您可以像使用define变量一样使用,请参阅示例

 define('AUTH_KEY','::~K~UC*[tlu4Eq/]Lm|h');

 function abc()
 {
  echo AUTH_KEY;
 }

 abc();  // ::~K~UC*[tlu4Eq/]Lm|h

http://codepad.viper-7.com/tUAg6D

答案 3 :(得分:0)

虽然选择常量优于普通变量,但这种信息最好存储在配置文件中而不是代码中。

此外,为了更好地重用并避免使用这些全局值,最好将封装功能:

class MyCrypto
{
    private $key;
    private $cipher;
    private $mode;

    public function __construct($key, $cipher, $mode = "cbc")
    {
       $this->key = $key;
       $this->cipher = $cipher;
       $this->mode = $mode;
    }

    public function generate_salt()
    {
        return mcrypt_create_iv(
            mcrypt_get_iv_size($this->cipher, $this->mode), 
            MCRYPT_DEV_URANDOM
        );
    }

    public function encrypt($data) { ... }

    public function decrypt($data) { ... }
}

我添加了一个salt生成器函数,用于每个加密操作;

最后,我建议使用CBC模式 - MCRYPT_MODE_CBC

答案 4 :(得分:0)

更新(27/09/17):

由于mcrypt_encrypt PHP 7.1.0 开始已弃用。我使用openssl添加了一个简单的加密/解密。

function encrypt($string, $key = 'PrivateKey', $secret = 'SecretKey', $method = 'AES-256-CBC') {
    // hash
    $key = hash('sha256', $key);
    // create iv - encrypt method AES-256-CBC expects 16 bytes
    $iv = substr(hash('sha256', $secret), 0, 16);
    // encrypt
    $output = openssl_encrypt($string, $method, $key, 0, $iv);
    // encode
    return base64_encode($output);
}

function decrypt($string, $key = 'PrivateKey', $secret = 'SecretKey', $method = 'AES-256-CBC') {
    // hash
    $key = hash('sha256', $key);
    // create iv - encrypt method AES-256-CBC expects 16 bytes
    $iv = substr(hash('sha256', $secret), 0, 16);
    // decode
    $string = base64_decode($string);
    // decrypt
    return openssl_decrypt($string, $method, $key, 0, $iv);
}

$str = 'Encrypt this text';
echo "Plain: " .$str. "\n";

// encrypt
$encrypted_str = encrypt($str);
echo "Encrypted: " .$encrypted_str. "\n";

// decrypt
$decrypted_str = decrypt($encrypted_str);
echo "Decrypted: " .$decrypted_str. "\n";

在您的示例中,当您可以允许PHP为您创建iv时,您使用相同的初始化向量**SECURE_AUTH_KEY_HERE**,这样您只需要定义1个SECURE_KEY。

<?php 
define('SECURE_KEY',md5('your secret key'));
/**
* Encrypt a value
*/
function encrypt($str){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECURE_KEY, $str, MCRYPT_MODE_ECB, $iv);
}
/**
* Decrypt a value
*/
function decrypt($str){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SECURE_KEY, $str, MCRYPT_MODE_ECB, $iv));
}


//32
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);

//Create an initialization vector (IV) from a random source 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

echo decrypt(encrypt('Encrypt me'));
?>