63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
|
|
package utils
|
||
|
|
|
||
|
|
import (
|
||
|
|
"crypto/md5"
|
||
|
|
"crypto/sha256"
|
||
|
|
"encoding/hex"
|
||
|
|
"io"
|
||
|
|
"os"
|
||
|
|
|
||
|
|
"golang.org/x/crypto/bcrypt"
|
||
|
|
)
|
||
|
|
|
||
|
|
// HashPassword 使用bcrypt对密码进行哈希
|
||
|
|
func HashPassword(password string) (string, error) {
|
||
|
|
bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||
|
|
return string(bytes), err
|
||
|
|
}
|
||
|
|
|
||
|
|
// CheckPassword 验证密码是否匹配
|
||
|
|
func CheckPassword(password, hash string) bool {
|
||
|
|
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
||
|
|
return err == nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// MD5Hash 计算字符串的MD5值
|
||
|
|
func MD5Hash(text string) string {
|
||
|
|
hash := md5.Sum([]byte(text))
|
||
|
|
return hex.EncodeToString(hash[:])
|
||
|
|
}
|
||
|
|
|
||
|
|
// FileMD5 计算文件的MD5值
|
||
|
|
// 用于秒传判断: 相同MD5的文件只需存储一份
|
||
|
|
func FileMD5(filePath string) (string, error) {
|
||
|
|
file, err := os.Open(filePath)
|
||
|
|
if err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
defer file.Close()
|
||
|
|
|
||
|
|
hash := md5.New()
|
||
|
|
if _, err := io.Copy(hash, file); err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
|
||
|
|
return hex.EncodeToString(hash.Sum(nil)), nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// FileSHA256 计算文件的SHA256值
|
||
|
|
func FileSHA256(filePath string) (string, error) {
|
||
|
|
file, err := os.Open(filePath)
|
||
|
|
if err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
defer file.Close()
|
||
|
|
|
||
|
|
hash := sha256.New()
|
||
|
|
if _, err := io.Copy(hash, file); err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
|
||
|
|
return hex.EncodeToString(hash.Sum(nil)), nil
|
||
|
|
}
|