first commit
This commit is contained in:
123
handwork/handback.go
Normal file
123
handwork/handback.go
Normal file
@@ -0,0 +1,123 @@
|
||||
package handwork
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
"golang.org/x/crypto/argon2"
|
||||
)
|
||||
|
||||
type HandResponse struct {
|
||||
Type string `json:"type"`
|
||||
Key string `json:"key"`
|
||||
Secret string `json:"secret"`
|
||||
}
|
||||
|
||||
func GenerateRandomString() string {
|
||||
randomBytes := make([]byte, 16)
|
||||
_, err := io.ReadFull(rand.Reader, randomBytes)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
encoded := base64.RawURLEncoding.EncodeToString(randomBytes)
|
||||
result := encoded[:int(math.Min(float64(len(encoded)), 16))]
|
||||
return result
|
||||
}
|
||||
|
||||
func HashPassword(password string) (string, error) {
|
||||
timeCost := uint32(5)
|
||||
memoryCost := uint32(64 * 1024)
|
||||
threads := uint8(8)
|
||||
keyLength := uint32(48)
|
||||
salt := make([]byte, 20)
|
||||
if _, err := io.ReadFull(rand.Reader, salt); err != nil {
|
||||
return "", err
|
||||
}
|
||||
hash := argon2.IDKey([]byte(password), salt, timeCost, memoryCost, threads, keyLength)
|
||||
hashedHex := hex.EncodeToString(hash)
|
||||
return fmt.Sprintf("%s:%s", hex.EncodeToString(salt), hashedHex), nil
|
||||
}
|
||||
|
||||
func Handback(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Println("收到介入请求")
|
||||
|
||||
var ctx = context.Background()
|
||||
client := redis.NewClient(&redis.Options{
|
||||
Addr: memoryconf.Ip + memoryconf.Port,
|
||||
Password: "",
|
||||
DB: 0,
|
||||
})
|
||||
|
||||
_, eror := client.Ping(context.Background()).Result()
|
||||
if eror != nil {
|
||||
fmt.Println("redis连接失败")
|
||||
handresponse := HandResponse{
|
||||
Type: "waiting",
|
||||
Key: conf.Key,
|
||||
}
|
||||
|
||||
hashjson, err := json.Marshal(handresponse)
|
||||
if err != nil {
|
||||
fmt.Println("返回请求失败")
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.Write(hashjson)
|
||||
return
|
||||
}
|
||||
|
||||
handkey := GenerateRandomString()
|
||||
|
||||
error := client.Set(ctx, conf.Key, handkey, 300*time.Second)
|
||||
if error != nil {
|
||||
fmt.Println("写入失败")
|
||||
handresponse := HandResponse{
|
||||
Type: "waiting",
|
||||
Key: conf.Key,
|
||||
}
|
||||
hashjson, err := json.Marshal(handresponse)
|
||||
if err != nil {
|
||||
fmt.Println("返回请求失败")
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.Write(hashjson)
|
||||
return
|
||||
}
|
||||
|
||||
hashedPassword, err := HashPassword(handkey)
|
||||
if err != nil {
|
||||
fmt.Println("加密失败:", err)
|
||||
handresponse := HandResponse{
|
||||
Type: "waiting",
|
||||
Key: conf.Key,
|
||||
}
|
||||
hashjson, err := json.Marshal(handresponse)
|
||||
if err != nil {
|
||||
fmt.Println("返回请求失败")
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.Write(hashjson)
|
||||
return
|
||||
}
|
||||
fmt.Println("加密后的哈希:", hashedPassword)
|
||||
|
||||
handresponse := HandResponse{
|
||||
Type: "waiting",
|
||||
Key: conf.Key,
|
||||
Secret: handkey,
|
||||
}
|
||||
hashjson, err := json.Marshal(handresponse)
|
||||
if err != nil {
|
||||
fmt.Println("返回请求失败")
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.Write(hashjson)
|
||||
}
|
||||
Reference in New Issue
Block a user