// Package sha1x 提供 SHA-1 摘要计算,以及十六进制/Base64 编码与流式、文件接口。 // // # 安全警告 // // SHA-1 已被证明无法抵抗碰撞攻击(SHAttered 等实际攻击已能在可控成本下构造碰撞), // 本包仅用于兼容旧系统或非安全用途(如 Git 对象名、旧版校验和), // 不可用于口令存储、口令派生、消息认证或数字签名。 // 新代码请使用 sha256x、sha512x、sha3x 或 blake2x。 package sha1x import ( "crypto/sha1" "encoding/base64" "encoding/hex" "fmt" "hash" "io" "os" ) const ( // Size 是 SHA-1 摘要的字节数(20)。 Size = sha1.Size // BlockSize 是 SHA-1 分组的字节数(64)。 BlockSize = sha1.BlockSize ) // New 返回一个计算 SHA-1 摘要的 hash.Hash,可反复 Write 以流式处理数据。 // // 安全警告:SHA-1 不安全,仅用于兼容旧系统或非安全用途(如校验和),不可用于口令或签名。 func New() hash.Hash { return sha1.New() } // Sum 返回 data 的 SHA-1 摘要(Size 字节原始数据)。 // // 安全警告:SHA-1 不安全,仅用于兼容旧系统或非安全用途(如校验和),不可用于口令或签名。 func Sum(data []byte) []byte { h := sha1.New() _, _ = h.Write(data) return h.Sum(nil) } // Hex 返回 data 的 SHA-1 摘要的小写十六进制字符串。 // // 安全警告:SHA-1 不安全,仅用于兼容旧系统或非安全用途(如校验和),不可用于口令或签名。 func Hex(data []byte) string { return hex.EncodeToString(Sum(data)) } // Base64 返回 data 的 SHA-1 摘要的标准 Base64 字符串。 // // 安全警告:SHA-1 不安全,仅用于兼容旧系统或非安全用途(如校验和),不可用于口令或签名。 func Base64(data []byte) string { return base64.StdEncoding.EncodeToString(Sum(data)) } // SumReader 读取 r 中的全部数据并返回其 SHA-1 摘要;读取失败时返回包装后的 error。 // // 安全警告:SHA-1 不安全,仅用于兼容旧系统或非安全用途(如校验和),不可用于口令或签名。 func SumReader(r io.Reader) ([]byte, error) { if r == nil { return nil, fmt.Errorf("sha1x: 读取器为 nil") } h := sha1.New() if _, err := io.Copy(h, r); err != nil { return nil, fmt.Errorf("sha1x: 读取数据失败: %w", err) } return h.Sum(nil), nil } // HexReader 读取 r 中的全部数据并返回其 SHA-1 摘要的小写十六进制字符串。 // // 安全警告:SHA-1 不安全,仅用于兼容旧系统或非安全用途(如校验和),不可用于口令或签名。 func HexReader(r io.Reader) (string, error) { sum, err := SumReader(r) if err != nil { return "", err } return hex.EncodeToString(sum), nil } // HexFile 计算 path 所指向文件的 SHA-1 摘要并返回小写十六进制字符串; // 文件不存在或读取失败时返回包装后的 error,不 panic。 // // 安全警告:SHA-1 不安全,仅用于兼容旧系统或非安全用途(如校验和),不可用于口令或签名。 func HexFile(path string) (string, error) { f, err := os.Open(path) if err != nil { return "", fmt.Errorf("sha1x: 打开文件 %q 失败: %w", path, err) } defer f.Close() sum, err := SumReader(f) if err != nil { return "", fmt.Errorf("sha1x: 计算文件 %q 摘要失败: %w", path, err) } return hex.EncodeToString(sum), nil }