完善不同加密方法的使用
This commit is contained in:
+124
-6
@@ -1,14 +1,132 @@
|
||||
// Package sha512x 提供 SHA-384 与 SHA-512 摘要计算,以及十六进制/Base64 编码与流式、文件接口。
|
||||
//
|
||||
// 命名约定:带位数后缀的函数(Sum384、Hex384、New384 等)明确指定算法变体;
|
||||
// 不带后缀的 Sum、Hex、Base64、New、SumReader、HexReader、HexFile 等价于 512 位变体,
|
||||
// 因为 SHA-512 是本包最常用的变体。
|
||||
package sha512x
|
||||
|
||||
import (
|
||||
"crypto/sha512"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"hash"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
// Sha512加密
|
||||
func Sha512(src string) string {
|
||||
m := sha512.New()
|
||||
m.Write([]byte(src))
|
||||
res := hex.EncodeToString(m.Sum(nil))
|
||||
return res
|
||||
const (
|
||||
// Size384 是 SHA-384 摘要的字节数(48)。
|
||||
Size384 = sha512.Size384
|
||||
// Size512 是 SHA-512 摘要的字节数(64)。
|
||||
Size512 = sha512.Size
|
||||
// BlockSize 是 SHA-384/SHA-512 分组的字节数(128)。
|
||||
BlockSize = sha512.BlockSize
|
||||
)
|
||||
|
||||
// New384 返回一个计算 SHA-384 摘要的 hash.Hash。
|
||||
func New384() hash.Hash {
|
||||
return sha512.New384()
|
||||
}
|
||||
|
||||
// New512 返回一个计算 SHA-512 摘要的 hash.Hash。
|
||||
func New512() hash.Hash {
|
||||
return sha512.New()
|
||||
}
|
||||
|
||||
// New 等价于 New512。
|
||||
func New() hash.Hash {
|
||||
return New512()
|
||||
}
|
||||
|
||||
// Sum384 返回 data 的 SHA-384 摘要(Size384 字节原始数据)。
|
||||
func Sum384(data []byte) []byte {
|
||||
return sum(sha512.New384(), data)
|
||||
}
|
||||
|
||||
// Sum512 返回 data 的 SHA-512 摘要(Size512 字节原始数据)。
|
||||
func Sum512(data []byte) []byte {
|
||||
return sum(sha512.New(), data)
|
||||
}
|
||||
|
||||
// Sum 等价于 Sum512。
|
||||
func Sum(data []byte) []byte {
|
||||
return Sum512(data)
|
||||
}
|
||||
|
||||
// Hex384 返回 data 的 SHA-384 摘要的小写十六进制字符串。
|
||||
func Hex384(data []byte) string {
|
||||
return hex.EncodeToString(Sum384(data))
|
||||
}
|
||||
|
||||
// Hex512 返回 data 的 SHA-512 摘要的小写十六进制字符串。
|
||||
func Hex512(data []byte) string {
|
||||
return hex.EncodeToString(Sum512(data))
|
||||
}
|
||||
|
||||
// Hex 等价于 Hex512。
|
||||
func Hex(data []byte) string {
|
||||
return Hex512(data)
|
||||
}
|
||||
|
||||
// Base64Sum384 返回 data 的 SHA-384 摘要的标准 Base64 字符串。
|
||||
func Base64Sum384(data []byte) string {
|
||||
return base64.StdEncoding.EncodeToString(Sum384(data))
|
||||
}
|
||||
|
||||
// Base64Sum512 返回 data 的 SHA-512 摘要的标准 Base64 字符串。
|
||||
func Base64Sum512(data []byte) string {
|
||||
return base64.StdEncoding.EncodeToString(Sum512(data))
|
||||
}
|
||||
|
||||
// Base64 等价于 Base64Sum512。
|
||||
func Base64(data []byte) string {
|
||||
return Base64Sum512(data)
|
||||
}
|
||||
|
||||
// SumReader 读取 r 中的全部数据并返回其 SHA-512 摘要;读取失败时返回包装后的 error。
|
||||
func SumReader(r io.Reader) ([]byte, error) {
|
||||
return sumReader(sha512.New(), r)
|
||||
}
|
||||
|
||||
// HexReader 读取 r 中的全部数据并返回其 SHA-512 摘要的小写十六进制字符串。
|
||||
func HexReader(r io.Reader) (string, error) {
|
||||
sum, err := SumReader(r)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return hex.EncodeToString(sum), nil
|
||||
}
|
||||
|
||||
// HexFile 计算 path 所指向文件的 SHA-512 摘要并返回小写十六进制字符串;
|
||||
// 文件不存在或读取失败时返回包装后的 error,不 panic。
|
||||
func HexFile(path string) (string, error) {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("sha512x: 打开文件 %q 失败: %w", path, err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
sum, err := sumReader(sha512.New(), f)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("sha512x: 计算文件 %q 摘要失败: %w", path, err)
|
||||
}
|
||||
return hex.EncodeToString(sum), nil
|
||||
}
|
||||
|
||||
// sum 把 data 一次性写入 h 并取出摘要。
|
||||
func sum(h hash.Hash, data []byte) []byte {
|
||||
_, _ = h.Write(data)
|
||||
return h.Sum(nil)
|
||||
}
|
||||
|
||||
// sumReader 把 r 的全部内容写入 h 并取出摘要。
|
||||
func sumReader(h hash.Hash, r io.Reader) ([]byte, error) {
|
||||
if r == nil {
|
||||
return nil, fmt.Errorf("sha512x: 读取器为 nil")
|
||||
}
|
||||
if _, err := io.Copy(h, r); err != nil {
|
||||
return nil, fmt.Errorf("sha512x: 读取数据失败: %w", err)
|
||||
}
|
||||
return h.Sum(nil), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user