Pages

May 13, 2021

phpでMySQL RDBのパスワードやWEBサービスのシークレットアクセスコードをより安全に保管する方法

phpでMySQL RDBのパスワードやWEBサービスのシークレットアクセスコードをより安全に保管する方法

RDBのパスワードやWEBサービスのシークレットアクセスコードを暗号化してphpソースコードに保管する。(平文のパスワードやアクセスコードはソースコードには絶対に保管しない)

暗号化 を簡単に行うには https://yaruben.sakura.ne.jp/openssl/php-aes.php?LANG=ja&INIT=1 を使う。

暗号化に用いた秘密鍵 "HIDDEN_KEY" を".ht_config.dat" という名前の隠しファイル(WEBブラウザから見られない、そしてGitHubソースコード管理サーバーに保管されない)に保管する。

暗号化したシークレットアクセスコード "ENCRYPTED_ACCESS_CODE" は、復号関数 my_decrypt() (以下参考) を用いて元のシークレットアクセスコードを求めてから使う。

Sample code to hide configuration.

The file "ht_config.dat" is hidden from WEB browser by Apache and won't be committed to GitHub.

% cat .ht_config.dat

<?php
define("HIDDEN_KEY", "xxxxtttttttttttttttttttxxxxxx");
?>

Sample code to decrypt an access code of another WEB service

<?php
...
require_once ".ht_config.dat";
function my_decrypt($key, $cipher_text)
{
    $c = base64_decode($cipher_text);
    $ivlen = openssl_cipher_iv_length("AES-256-CBC");
    $iv = substr($c, 0, $ivlen);
    $hmac = substr($c, $ivlen, 512/8);
    $ciphertext_raw = substr($c, $ivlen + (512/8));
    $original_plaintext = openssl_decrypt($ciphertext_raw, "AES-256-CBC", $key, OPENSSL_RAW_DATA, $iv);
    $calcmac = hash_hmac('sha512', $ciphertext_raw, $key, $as_binary = true);
    if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
    {
        return $original_plaintext;
    }
    return false;
}
define("ENCRYPTED_ACCESS_CODE", "l59DIPIWOx1s6OOTKB7BonvDIUXGvHiHEmlyDamC8tNqlUM+QRFL+xbdLlodETt0Hr/QscCre6ZZTR5WhzCJV1PpGneh8yz8llmV/8DaErlbMHzVR7ToT0biWI5a1YtTAvt38URjhypdceRomyOrAE1PJtYMvaDk4DOXXTUMoMf8er1r6LFZ7H+SESJIZSLD");
$original_access_code = my_decrypt(HIDDEN_KEY, ENCRYPTED_ACCESS_CODE);
if ($original_access_code !== false)
{
    access_another_WEB_service($original_access_code);
}
...
?>

No comments:

Post a Comment