generateSingleRecoveryCode 生成单个恢复码 格式: XXXX-XXXX-XXXX-XXXX(去除易混淆字符)
()
| 28 | // generateSingleRecoveryCode 生成单个恢复码 |
| 29 | // 格式: XXXX-XXXX-XXXX-XXXX(去除易混淆字符) |
| 30 | func generateSingleRecoveryCode() (string, error) { |
| 31 | // 字符集:大写字母和数字(去除易混淆字符 0/O, 1/I/L) |
| 32 | const charset = "ABCDEFGHJKMNPQRSTUVWXYZ23456789" |
| 33 | |
| 34 | bytes := make([]byte, recoveryCodeLength) |
| 35 | if _, err := rand.Read(bytes); err != nil { |
| 36 | return "", fmt.Errorf("生成随机数失败: %w", err) |
| 37 | } |
| 38 | |
| 39 | parts := make([]string, 4) |
| 40 | for i := 0; i < 4; i++ { |
| 41 | part := "" |
| 42 | for j := 0; j < 4; j++ { |
| 43 | idx := int(bytes[i*4+j]) % len(charset) |
| 44 | part += string(charset[idx]) |
| 45 | } |
| 46 | parts[i] = part |
| 47 | } |
| 48 | |
| 49 | return strings.Join(parts, "-"), nil |
| 50 | } |
| 51 | |
| 52 | // HashRecoveryCodes 计算恢复码的哈希 |
| 53 | // 存储哈希而非明文,提高安全性 |
no outgoing calls
no test coverage detected