/** * 解密字符串 * * @param string $value 待加密的数据(数字, 字符串, 数组或对象等) * @param string $key 解密密钥 * @param string $target 解码目标 * * @return string */ public static function decrypt($value, $key, $target = 'url') { // Base64解码 $base = new Base64(); $value = $base->decode($value, $target); // 拆分加密结果(校验码, 有效期, 初始化向量, 加密数据) $hmac = substr($value, 0, self::HMAC_SIZE); $expire = substr($value, self::HMAC_SIZE, self::EXPIRE_SIZE); $iv = substr($value, self::HMAC_SIZE + self::EXPIRE_SIZE, self::IV_SIZE); $value = substr($value, self::HMAC_SIZE + self::EXPIRE_SIZE + self::IV_SIZE); // 超出有效期 if (time() > hexdec(bin2hex($expire))) { return false; } // 验证密文是否被篡改 if (static::compareString(static::hmac($iv, $value, $key), bin2hex($hmac)) === false) { return false; } // 解密数据 $value = openssl_decrypt($value, self::CIPHER_MODE, $key, OPENSSL_RAW_DATA, $iv); if (false === $value) { return false; } // 反序列化 $value = static::unpacking($value); // 返回解密结果 return $value; }