セキュリティユーティリティ
class
Cake\Utility\Security
security library は、 データのハッシュ化や暗号化などのメソッドなどの基本的なセキュリティ分野を取り扱います。
データの暗号化と復号
$text
の暗号化には AES-256 を利用します。 $key
は例えば「よいパスワード」のように、 沢山の分散された値であるべきです。返却される結果は HMAC チェックサム(checksum)つきの 暗号化された値となります。
このメソッドは、 openssl か mcrypt のいずれかを利用し、 あなたのシステムで有効であることが基準になります。 いずれかの実装で暗号化されたデータは、もう一方の実装に移植できます。
WARNING
mcrypt 拡張は、PHP7.1 で非推奨になりました。
このメソッドは 決して パスワードの保存に使ってはいけません。代わりに一方通行の ハッシュ化メソッド Cake\Utility\Security::hash()
を利用すべきです。 以下に一例を挙げます。 :
// キーがどこかに保存されたと仮定すれば、あとで復号のために再利用されることが可能
$key = 'wt1U5MACWJFTXGenFoZoiLwQGrLgdbHA';
$result = Security::encrypt($value, $key);
もしあなたが HMAC ソルトを提供しなければ、 Security.salt
の値が利用されます。 暗号化された値は Cake\Utility\Security::decrypt()
を利用して復号できます。
すでに暗号化された値を復号します。 $key
と $hmacSalt
のパラメーターは、 暗号化時に利用された各々の値と一致する必要があり、さもなければ復号は失敗します。 以下に一例を挙げます。 :
// キーがどこかに保存されたと仮定すれば、あとで復号のために再利用されることが可能
$key = 'wt1U5MACWJFTXGenFoZoiLwQGrLgdbHA';
$cipher = $user->secrets;
$result = Security::decrypt($cipher, $key);
キーや HMAC ソルトの変更により値が復号できない場合、 false
が返却されます。
特定の暗号化を実装を選択
もし CakePHP 2.x からアプリケーションをアップグレードするならば、 2.x で暗号化されたデータは openssl では互換性がありません。これは、暗号化されたデータは AES に完全には準拠していないから です。もしデータを再度暗号化するときにトラブルを避けたければ、 engine()
メソッドを使用して mcrypt
の利用を CakePHP に強制できます。 :
// config/bootstrap.php の中で
use Cake\Utility\Crypto\Mcrypt;
Security::engine(new Mcrypt());
上記は古いバージョンの CakePHP のデータのシームレスな読み込みを許可し、新しいデータを 暗号化すると OpenSSL 互換となります。
データのハッシュ化
このメソッドで文字列からハッシュを作成します。次の有効なメソッドを頼ってください。 もし $salt
が true
にセットされていた場合、アプリケーションのソルト値が 利用されます。 :
// アプリケーションのソルト値を利用
$sha1 = Security::hash('CakePHP Framework', 'sha1', true);
// カスタムソルト値を利用
$sha1 = Security::hash('CakePHP Framework', 'sha1', 'my-salt');
// デフォルトのハッシュアルゴリズムを利用
$hash = Security::hash('CakePHP Framework');
hash()
メソッドは以下のハッシュ方法をサポートします。
- md5
- sha1
- sha256
そして、PHP の hash()
関数がサポートしている他のハッシュアルゴリズムもサポートします。
WARNING
新しいアプリケーションのパスワード用に hash()
を利用すべきではありません。 代わりにデフォルトで bcrypt を利用する DefaultPasswordHasher
クラスを利用すべきです。
セキュアなランダムデータの取得
セキュアなランダムソースから $length
バイト数を取得します。この関数は、 以下のソースの1つからデータを生成します。
- PHP の
random_bytes
関数。 - SSL 拡張の
openssl_random_pseudo_bytes
。
どちらのソースも利用できない場合、警告が発せられ、 後方互換のために安全ではない値が使用されます。
セキュアなランダムソースから長さ $length
のランダムな文字列を取得します。 このメソッドは、 randomBytes()
と同じランダムソースから生成し、 データを16進文字列としてエンコードします。