mirror of https://github.com/veypi/OneAuth.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
|
1 week ago
|
//
|
||
|
|
// Copyright (C) 2024 veypi <i@veypi.com>
|
||
|
|
// 2025-03-04 16:08:06
|
||
|
|
// Distributed under terms of the MIT license.
|
||
|
|
//
|
||
|
|
|
||
|
2 weeks ago
|
package crypto
|
||
|
|
|
||
|
|
import (
|
||
|
|
"crypto/rand"
|
||
|
|
"encoding/base64"
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"golang.org/x/crypto/bcrypt"
|
||
|
|
)
|
||
|
|
|
||
|
|
// HashPassword 使用bcrypt哈希密码
|
||
|
|
func HashPassword(password string, cost int) (string, error) {
|
||
|
|
bytes, err := bcrypt.GenerateFromPassword([]byte(password), cost)
|
||
|
|
if err != nil {
|
||
|
|
return "", fmt.Errorf("failed to hash password: %w", err)
|
||
|
|
}
|
||
|
|
return string(bytes), nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// VerifyPassword 验证密码
|
||
|
|
func VerifyPassword(password, hash string) bool {
|
||
|
|
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
||
|
|
return err == nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// GenerateRandomString 生成随机字符串
|
||
|
|
func GenerateRandomString(length int) (string, error) {
|
||
|
|
bytes := make([]byte, length)
|
||
|
|
if _, err := rand.Read(bytes); err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
return base64.URLEncoding.EncodeToString(bytes)[:length], nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// GenerateSecret 生成密钥
|
||
|
|
func GenerateSecret(length int) string {
|
||
|
|
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||
|
|
bytes := make([]byte, length)
|
||
|
|
rand.Read(bytes)
|
||
|
|
for i, b := range bytes {
|
||
|
|
bytes[i] = charset[b%byte(len(charset))]
|
||
|
|
}
|
||
|
|
return string(bytes)
|
||
|
|
}
|
||
|
|
|
||
|
|
// GenerateClientID 生成OAuth客户端ID
|
||
|
|
func GenerateClientID() string {
|
||
|
|
return "vc_" + GenerateSecret(28)
|
||
|
|
}
|
||
|
|
|
||
|
|
// GenerateClientSecret 生成OAuth客户端密钥
|
||
|
|
func GenerateClientSecret() string {
|
||
|
|
return GenerateSecret(64)
|
||
|
|
}
|