This commit is contained in:
hailin 2025-06-17 22:45:20 +08:00
parent 1790c48009
commit c6c2bdbe4a
3 changed files with 45 additions and 6 deletions

View File

@ -5,19 +5,31 @@ import (
"crypto/elliptic" "crypto/elliptic"
"crypto/rand" "crypto/rand"
"crypto/sha256" "crypto/sha256"
"crypto/x509"
"encoding/asn1" "encoding/asn1"
"encoding/base64" "encoding/base64"
"license-server/storage"
"math/big" "math/big"
) )
var privateKey *ecdsa.PrivateKey var privateKey *ecdsa.PrivateKey
func init() { // 显式从 main 传入 DB保证先建库再读写
var err error func InitCrypto(db storage.Database) {
privateKey, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader) // 1. 读取
if err != nil { if pem, ok := db.GetPrivateKey(); ok {
panic(err) if der, err := base64.StdEncoding.DecodeString(pem); err == nil {
if key, err := x509.ParseECPrivateKey(der); err == nil {
privateKey = key
return
} }
}
}
// 2. 不存在或解析失败 → 重新生成并落库
key, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
der, _ := x509.MarshalECPrivateKey(key)
db.SavePrivateKey(base64.StdEncoding.EncodeToString(der))
privateKey = key
} }
// ecdsaSignature 是 ASN.1 编码中使用的结构体 // ecdsaSignature 是 ASN.1 编码中使用的结构体

View File

@ -9,6 +9,7 @@ import (
func main() { func main() {
db := storage.InitDB() db := storage.InitDB()
license.InitCrypto(db)
app := fiber.New() app := fiber.New()
app.Post("/api/license/generate", license.GenerateLicenseHandler(db)) app.Post("/api/license/generate", license.GenerateLicenseHandler(db))

View File

@ -2,6 +2,8 @@ package storage
import ( import (
"database/sql" "database/sql"
"os"
"path/filepath"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
@ -11,7 +13,13 @@ type Database struct {
} }
func InitDB() Database { func InitDB() Database {
db, _ := sql.Open("sqlite3", "./license.db") const dbPath = "/root/database/license.db"
// 确保目录存在
_ = os.MkdirAll(filepath.Dir(dbPath), 0700)
db, _ := sql.Open("sqlite3", dbPath)
db.Exec(`CREATE TABLE IF NOT EXISTS activations ( db.Exec(`CREATE TABLE IF NOT EXISTS activations (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
machine_id TEXT UNIQUE, machine_id TEXT UNIQUE,
@ -23,6 +31,13 @@ func InitDB() Database {
machine_id TEXT UNIQUE, machine_id TEXT UNIQUE,
license TEXT license TEXT
)`) )`)
/* ➊ 额外表:持久化私钥(仅一行) */
db.Exec(`CREATE TABLE IF NOT EXISTS private (
id INTEGER PRIMARY KEY,
key TEXT
)`)
return Database{db} return Database{db}
} }
@ -49,3 +64,14 @@ func (d Database) SaveGenerated(machineID string, licenseText string) {
d.db.Exec("INSERT OR REPLACE INTO generations(machine_id, license) VALUES (?, ?)", d.db.Exec("INSERT OR REPLACE INTO generations(machine_id, license) VALUES (?, ?)",
machineID, licenseText) machineID, licenseText)
} }
/* ===== 新增两个工具方法 ===== */
func (d Database) GetPrivateKey() (string, bool) {
row := d.db.QueryRow("SELECT key FROM private WHERE id = 1")
var key string
return key, row.Scan(&key) == nil
}
func (d Database) SavePrivateKey(key string) {
d.db.Exec("INSERT OR REPLACE INTO private(id, key) VALUES (1, ?)", key)
}