安全特性
Pipeline 架构
文件写入经过完整安全 pipeline(顺序不可变):
明文 → ① 算 MD5(去重 key)→ ② gzip 压缩 → ③ AES-256-CTR 加密 → ④ 物理存储
读取:物理读 → 解密 → 解压 → 明文
压缩必须在加密前(密文高熵不可压缩)。MD5 基于明文不受影响。
AES-256-CTR 分块加密(W1-A12)
初始化
# 生成 32 字节随机 master_key(CSPRNG)并自动开启加密
docker exec uldisk-dev-uldisk-1 php think encryption:init
执行后自动设置:
encryption.master_key= base64(32 字节随机密钥)encryption.enabled= 1
特性
| 特性 | 说明 |
|---|---|
| 算法 | AES-256-CTR(流式,无 padding,密文长度 = 明文长度) |
| 密钥模型 | 开源版:1 admin = 1 master_key(key_id 固定 0) |
| IV 语义 | 每 chunk_md5 独立 IV,同 chunk 复用 IV 保证物理去重一致 |
| 性能 | AES-NI 硬件加速,约 3.5ms/4MB chunk |
| 向后兼容 | 旧 chunk 保持明文(per-chunk encrypted 标志决定是否解密) |
配置项
| 键 | 默认值 | 说明 |
|---|---|---|
encryption.enabled |
0 | 全局开关(0=关闭,1=开启) |
encryption.master_key |
空 | base64 编码的 32 字节密钥 |
S3 SSE 联动
S3 PutObject 带 x-amz-server-side-encryption: AES256 头时,该对象强制加密(无视全局开关)。
aws --endpoint-url http://localhost:8002/s3 s3api put-object \
--bucket mybucket --key secret.txt \
--body secret.txt \
--server-side-encryption AES256
gzip 分块压缩(W1-A13)
配置项
| 键 | 默认值 | 说明 |
|---|---|---|
compression.enabled |
0 | 全局开关 |
compression.types |
见下 | content_type 白名单(JSON 数组) |
默认白名单:
["text/*", "application/json", "application/xml", "application/csv", "application/javascript"]
特性
- 仅压缩可压缩格式(text/json/xml/csv/js),已压缩格式(jpg/png/mp4/zip)自动跳过
- gzip level 6(默认平衡档)
- 与加密叠加:压缩 → 加密(pipeline 顺序)
compressed标志与 chunk_md5 1:1 绑定,物理 chunk 全局共享同一份压缩+加密产物
content_filter 内容过滤(W1-A11)
配置方式
在存储位置的 config JSON 中设置 content_filter:
{
"content_filter": "image/*"
}
匹配规则
- 使用
fnmatch模式匹配(同 shell glob) - 支持
image/*(允许所有图片)、!application/zip(排除 zip)等模式 - 路由阶段校验,不匹配的 content_type 跳过此 position
- content_type 未知(null)时跳过(防鸡生蛋问题)
示例
| 过滤规则 | 效果 |
|---|---|
image/* |
仅允许图片写入此位置 |
text/*,application/json |
仅允许文本和 JSON |
!application/zip,!application/x-rar-compressed |
排除压缩文件 |
507 容量不足处理(E6)
所有 position 容量满 / 被过滤 / 禁用时,抛出 InsufficientStorageException:
| 协议 | HTTP 状态 | 映射 |
|---|---|---|
| WebDAV | 507 Insufficient Storage | SabreDAV 异常 |
| S3 | 503 Slow Down | S3 无 507,用 503 近似 |
| REST API | 200 + code=1 |
项目 JSON 封装 |
IO 类失败(写入失败、副本竞争)仍走
RuntimeException,不在此异常语义内。
原文标题:安全特性
原文文档:uldisk
原文地址:/read/augushong/ul-disk/zh-cn/1.0.0/6a3e73c598601/6a3e73d846a8a.html
原文平台:奥宏文档
1.0.0