1

機密データのようにグローバル変数を使用するべきではないことがわかったのでglobal $auth_key(そうでない場合は修正してください)、セキュリティキーを格納するために定義済み変数を使用したいと思いました。

内部config.phpソルトキーが定義されています。

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

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

Inには、内部で使用される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で使用されるキーの最大長はどれくらいですか?

ありがとう、そしてあなたの返事を楽しみにしています。

4

5 に答える 5

1

原則として、ロガーはキー、ストーガーは暗号化です。次に、データが非常に短い場合を除いてECBを使用しないでください。CBCまたはより強力なものを使用する必要があります。3番目:ソルトまたは初期化ベクトルを使用します。最後にこれを読んでください:https ://www.owasp.org/index.php/Cryptographic_Storage_Cheat_Sheet

于 2013-02-09T07:13:06.180 に答える
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

定数の使用は、ドル記号がないことを除いて、変数の使用と同じです。

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

このアプローチでは、globalキーワードを使用するよりも本質的に安全なものはありません。このアプローチが推奨されますが。定数を使用すると、これはアプリケーション全体で使用する静的な値であると言えます。global一方、使用しなければならないのは、多くの場合、デザインの悪さや怠惰の結果です。それは、スコーピングが達成しようとすることを悪用して、追跡するのが難しいコードにつながります。

キーの長さは、使用する暗号化アルゴリズムによって異なります。RTM。

于 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

更新 (27/09/17):

mcrypt_encryptPHP 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";

あなたの例では**SECURE_AUTH_KEY_HERE**、PHP が iv を作成できるようにするときに同じ初期化ベクトルを使用しています。

<?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 に答える