我发现我不应该使用像global $auth_key
这样的全局变量来处理敏感数据(如果不是这样的话,请纠正我。)因此我想使用已定义的变量来存储安全密钥。
定义内部config.php
盐键。
define('AUTH_KEY','::~K~UC*[tlu4Eq/]Lm|h');
define('SECURE_AUTH_KEY', 'QsTMvbV+tuU{K26!]J2');
在encryption.php
中包含将在其中使用AUTH_KEY
和SECURE_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上使用的密钥的最大长度是多少?
感谢您并期待您的回复。
答案 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
答案 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)
由于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'));
?>