1

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

定义了内部config.php盐键。

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

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

Inencryption.php包含加密函数 whereAUTH_KEYSECURE_AUTH_KEYwill 在里面使用。

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 上使用的密钥的最大长度是多少?

谢谢您,期待您的回复。

4

5 回答 5

1

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

于 2013-02-09T07:13:06.180 回答
0

使用常量就像使用变量一样,只是没有美元符号。

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

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

密钥长度取决于使用的加密算法。即时通讯。

于 2013-02-09T07:10:00.360 回答
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

于 2013-02-09T07:10:19.467 回答
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) { ... }
}

我添加了用于每个加密操作的盐生成器功能;

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

于 2013-02-09T07:18:01.590 回答
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'));
?>
于 2013-02-09T07:21:54.697 回答