STEAM PLACE

エンジニアリングとマネジメント

CakePHP / Security.salt とは? Security.cipherSeed とは?

Security.salt と Security.cipherSeed をソースコードから探してみた

CakePHP をインストールすると最初に設定する salt 値について、結局これってどこで使われているのというのがネット上にはあまりなかったので調べてみた。

 Security.salt

 UUID生成で使用

lib/Cake/Utility/CakeText.php:77
 
public static function uuid() {
  # 中略
        if (empty($node)) {
            $node = crc32(Configure::read('Security.salt'));
        }

 hash関数で使用

hash関数のデフォルト salt になるようだ。

lib/Cake/Utility/Security.php:117
 
public static function hash($string, $type = null, $salt = false) {
  # 中略
        if ($salt) {
            if (!is_string($salt)) {
                $salt = Configure::read('Security.salt');
            }
            $string = $salt . $string;
        }

 salt文字抜き出しで使用

lib/Cake/Utility/Security.php:250
 
/**
 * Generates a pseudo random salt suitable for use with php's crypt() function.
 * The salt length should not exceed 27. The salt will be composed of
 * [./0-9A-Za-z]{$length}.
 *
 * @param int $length The length of the returned salt
 * @return string The generated salt
 */
    protected static function _salt($length = 22) {
        $salt = str_replace(
            array('+', '='),
            '.',
            base64_encode(sha1(uniqid(Configure::read('Security.salt'), true), true))
        );
        return substr($salt, 0, $length);
    }

 暗号化で使用

lib/Cake/Utility/Security.php:309
 
    public static function encrypt($plain, $key, $hmacSalt = null) {
        static::_checkKey($key, 'encrypt()');

        if ($hmacSalt === null) {
            $hmacSalt = Configure::read('Security.salt');
        }

 復号化で使用

lib/Cake/Utility/Security.php:352
 
    public static function decrypt($cipher, $key, $hmacSalt = null) {
        static::_checkKey($key, 'decrypt()');
        if (empty($cipher)) {
            throw new CakeException(__d('cake_dev', 'The data to decrypt cannot be empty.'));
        }
        if ($hmacSalt === null) {
            $hmacSalt = Configure::read('Security.salt');
        }

 Security.cipher

 暗号化で使用

lib/Cake/Utility/Security.php:184
 
    public static function cipher($text, $key) {
        if (empty($key)) {
            trigger_error(__d('cake_dev', 'You cannot use an empty key for %s', 'Security::cipher()'), E_USER_WARNING);
            return '';
        }

        srand(Configure::read('Security.cipherSeed'));

 結果

まあ、予想通りな感じで特に面白みのない結果に…。
ざっくりは以下のように捉えて全く問題なさそう。

CakePHP2 実践入門より

Security.salt と Security.cipherSeed は、CakePHP がパスワードや Cookie に保存する情報を、ハッシュ化や暗号化する際に利用されます。