- account: accounts.json 原子读写、常量时间口令校验、增删改查与用户名校验 - auth: HMAC 会话签名 + 管理员 bcrypt 凭据初始化 - randstr: 口令生成;usage: 目录用量统计 - 单测覆盖口令对错、账号禁用、只读、路径逃逸、持久化与 0600 权限
26 lines
636 B
Go
26 lines
636 B
Go
// Package randstr 生成不依赖第三方库的随机字符串。
|
|
package randstr
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"math/big"
|
|
)
|
|
|
|
// 去掉了容易混淆的 0/O/1/l/I。
|
|
const charset = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"
|
|
|
|
// Generate 返回 n 个字符的随机口令。
|
|
func Generate(n int) (string, error) {
|
|
buf := make([]byte, n)
|
|
max := big.NewInt(int64(len(charset)))
|
|
for i := range buf {
|
|
// 每个字符独立取一个均匀随机的下标,避免取模偏置。
|
|
idx, err := rand.Int(rand.Reader, max)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
buf[i] = charset[idx.Int64()]
|
|
}
|
|
return string(buf), nil
|
|
}
|