From 13943b5658b15737394d70157802156e0a852dfd Mon Sep 17 00:00:00 2001 From: qydysky Date: Fri, 25 Apr 2025 21:28:31 +0800 Subject: [PATCH] =?utf8?q?Add=20Cookie=E5=8A=A0=E5=AF=86=E6=94=AF=E6=8C=81?= =?utf8?q?mlkem=20(#194)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * Add Cookie加密支持mlkem * Improve cookie文件读取解密仅发生在启动时 * Improve 优化说明 * Improve 使用复制而非引用 * Improve 更新说明 --- CV/Var.go | 9 ++++---- F/CookieCrypo.go | 48 +++++++++++++++++++++++++++++------------ README.md | 56 ++++++++++++++++++++++++++++++++++++++++++------ demo/private.pem | 7 +++--- demo/public.pem | 38 +++++++++++++++++++++++++++++--- go.mod | 2 +- go.sum | 4 ++-- 7 files changed, 131 insertions(+), 33 deletions(-) diff --git a/CV/Var.go b/CV/Var.go index 196e17a..e152a97 100644 --- a/CV/Var.go +++ b/CV/Var.go @@ -4,6 +4,7 @@ import ( "database/sql" _ "embed" "encoding/json" + "encoding/pem" "errors" "flag" "fmt" @@ -23,7 +24,7 @@ import ( "github.com/dustin/go-humanize" _ "github.com/go-sql-driver/mysql" _ "github.com/jackc/pgx/v5/stdlib" - crypto "github.com/qydysky/part/crypto" + pca "github.com/qydysky/part/crypto/asymmetric" pctx "github.com/qydysky/part/ctx" file "github.com/qydysky/part/file" log "github.com/qydysky/part/log" @@ -388,13 +389,13 @@ func (t *Common) Init() *Common { flag.Parse() if *genKey { - if pri, pub, e := crypto.NewKey(); e != nil { + if pri, pub, e := pca.MlkemF.NewKey(); e != nil { panic(e) } else { fmt.Println("公钥:") - fmt.Println(string(pub)) + fmt.Println(string(pem.EncodeToMemory(pub))) fmt.Println("私钥:") - fmt.Println(string(pri)) + fmt.Println(string(pem.EncodeToMemory(pri))) fmt.Println("请复制以上公私钥并另存为文件,可以在cookie加密公钥、cookie解密私钥中使用") os.Exit(0) } diff --git a/F/CookieCrypo.go b/F/CookieCrypo.go index e82b658..5a37f93 100644 --- a/F/CookieCrypo.go +++ b/F/CookieCrypo.go @@ -1,13 +1,15 @@ package F import ( + "encoding/pem" "fmt" "io" "os" "sync" c "github.com/qydysky/bili_danmu/CV" - crypto "github.com/qydysky/part/crypto" + pca "github.com/qydysky/part/crypto/asymmetric" + pcs "github.com/qydysky/part/crypto/symmetric" file "github.com/qydysky/part/file" ) @@ -16,7 +18,9 @@ var ( clog = c.C.Log.Base(`cookie加密`) pub []byte pri []byte + cookie []byte cookieLock sync.RWMutex + sym = pcs.Chacha20poly1305F ) func CookieGet(path string) []byte { @@ -25,6 +29,13 @@ func CookieGet(path string) []byte { cookieLock.RLock() defer cookieLock.RUnlock() + if len(cookie) > 0 { + clog.L(`T: `, `从内存中获取cookie`) + return cookie + } else { + clog.L(`T: `, `从文件中获取cookie`) + } + if len(pri) == 0 { if priS, ok := c.C.K_v.LoadV(`cookie解密私钥`).(string); ok && priS != `` { if d, e := FileLoad(priS); e != nil { @@ -65,18 +76,18 @@ func CookieGet(path string) []byte { clog.L(`E: `, e, `cookie保存格式`) return []byte{} } else if string(d[:6]) == `t=pem;` { - if s, e := crypto.Decrypt(d[6:], pri); e != nil { + priKey, _ := pem.Decode(pri) + if dec, e := pca.ChoseAsymmetricByPem(priKey).Decrypt(priKey); e != nil { clog.L(`E: `, e) return []byte{} } else { - return s - } - } else if string(d[:3]) == `pem` { - if s, e := crypto.Decrypt(d[3:], pri); e != nil { - clog.L(`E: `, e) - return []byte{} - } else { - return s + b, ext := pca.Unpack(d[6:]) + if s, e := dec(sym, b, ext); e != nil { + clog.L(`E: `, e) + return []byte{} + } else { + return s + } } } else { clog.L(`E: `, e, `cookie保存格式:`, string(d[:6])) @@ -90,6 +101,9 @@ func CookieSet(path string, source []byte) { cookieLock.Lock() defer cookieLock.Unlock() + cookie = append(cookie[:0], source...) + clog.L(`T: `, `保存cookie到文件`) + if len(pub) == 0 { if pubS, ok := c.C.K_v.LoadV(`cookie加密公钥`).(string); ok && pubS != `` { if d, e := FileLoad(pubS); e != nil { @@ -105,13 +119,19 @@ func CookieSet(path string, source []byte) { return } } - if source, e := crypto.Encrypt(source, pub); e != nil { + pubKey, _ := pem.Decode(pub) + if enc, e := pca.ChoseAsymmetricByPem(pubKey).Encrypt(pubKey); e != nil { clog.L(`E: `, e) return } else { - f := file.New(path, 0, true) - _ = f.Delete() - _, _ = f.Write(append([]byte("t=pem;"), source...), true) + if b, ext, e := enc(sym, source); e != nil { + clog.L(`E: `, e) + return + } else { + f := file.New(path, 0, true) + _ = f.Delete() + _, _ = f.Write(append([]byte("t=pem;"), pca.Pack(b, ext)...), true) + } } } diff --git a/README.md b/README.md index 4ec80d9..bf797df 100644 --- a/README.md +++ b/README.md @@ -987,6 +987,17 @@ Asaki大人 开心鸭鸭杀 直播中 还支持登录、搜索主播直播间、查看历史记录、查看关注的直播间、保存直播流等功能 #### cookie加密 +在(>0.16.9),添加对于`mlkem`的算法支持,`-genKey`默认将产生`mlkem`算法公私钥。保留对`X25519`算法(<=0.16.9)产生的cookie加解密的支持,`demo/`下的(public.pem)(private.pem)默认更新为`mlkem`格式。 + +如需更新密钥(如从`X25519`转换到`mlkem`),而不重新登陆,参考如下步骤: + +- 在非正式环境,使用`-genKey`命令行参数生成新密钥。注:此命令行参数仅需要主程序(如`main`/`main.exe`),无需其他资源文件即可生成 +- 拷贝步骤1命令行打印的新公钥到正式环境的`cookie加密公钥`文件 +- 确保你正式环境的主程序版本已大于>0.16.9 +- 启动正式环境程序,这将使用旧私钥读取cookie并用新公钥加密cookie +- 拷贝步骤1命令行打印的新私钥到正式环境的`cookie解密私钥`文件 +- 更新完成 + *使用X25519和chacha20poly1305*(>v0.14.15) 保护cookie.txt 在`demo/config/config_K_v.json`中可找到配置项 @@ -1006,14 +1017,47 @@ Asaki大人 开心鸭鸭杀 直播中 main(main.exe) -genKey 公钥: ------BEGIN ECDH PUBLIC KEY----- -tvdVdbI7DTlRcyE44va7zXhi5rewxcm44/Dmp8DMnGY= ------END ECDH PUBLIC KEY----- +-----BEGIN MLKEM PUBLIC KEY----- +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 +-----END MLKEM PUBLIC KEY----- 私钥: ------BEGIN ECDH PRIVATE KEY----- -xrWweTO5upvzDha6WrEBQKkToUYLyMCI7An2btRqop0= ------END ECDH PRIVATE KEY----- +-----BEGIN MLKEM PRIVATE KEY----- +6lJ+OzINP4QmpqKFtlCi5lFHaYneWpfjBkU6xlnrlmMCFBRn1tlYQVf91HT9IOEh +kuDE/k1SerQNHYP7oBVRsw== +-----END MLKEM PRIVATE KEY----- 请复制以上公私钥并另存为文件,可以在cookie加密公钥、cookie解密私钥中使用 ``` diff --git a/demo/private.pem b/demo/private.pem index 679fb4c..2653306 100644 --- a/demo/private.pem +++ b/demo/private.pem @@ -1,3 +1,4 @@ ------BEGIN ECDH PRIVATE KEY----- -wmVxRqMp4bs+4xvOOlW0p2tyF2VGykhVqncxDo/IsKo= ------END ECDH PRIVATE KEY----- \ No newline at end of file +-----BEGIN MLKEM PRIVATE KEY----- +nHI/OIr3YPlS2ufjqgCSSbQg3nGA7jdjqhfVc0f7DhyQ3eMLTM8O1sIEr+Jzabvf +i5Pb8YtRTDO0Q2JD46lxGA== +-----END MLKEM PRIVATE KEY----- \ No newline at end of file diff --git a/demo/public.pem b/demo/public.pem index 2780b61..fbbde2a 100644 --- a/demo/public.pem +++ b/demo/public.pem @@ -1,3 +1,35 @@ ------BEGIN ECDH PUBLIC KEY----- -JAyDXPJ2jNouYCC1xp51RRvAhCYrohCN/5ZhOgDbW2c= ------END ECDH PUBLIC KEY----- \ No newline at end of file +-----BEGIN MLKEM PUBLIC KEY----- +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 +-----END MLKEM PUBLIC KEY----- \ No newline at end of file diff --git a/go.mod b/go.mod index 39e6df1..6daf7fb 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24 require ( github.com/gotk3/gotk3 v0.6.4 github.com/mdp/qrterminal/v3 v3.2.0 - github.com/qydysky/part v0.28.20250416231148 + github.com/qydysky/part v0.28.20250424194925 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 golang.org/x/text v0.24.0 // indirect diff --git a/go.sum b/go.sum index 68196bc..23f9249 100644 --- a/go.sum +++ b/go.sum @@ -46,8 +46,8 @@ github.com/qydysky/biliApi v0.0.0-20250406112014-bf8c070170f6 h1:eWklz9YhqcLnJeH github.com/qydysky/biliApi v0.0.0-20250406112014-bf8c070170f6/go.mod h1:1FbgCj+aOwIvuRRuX/l5uTLb3JIwWyJSa0uEfwpYV/8= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 h1:k451T+bpsLr+Dq9Ujo+Qtx0iomRA1XXS5ttlEojvfuQ= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9/go.mod h1:cI8/gy/wjy2Eb+p2IUj2ZuDnC8R5Vrx3O0VMPvMvphA= -github.com/qydysky/part v0.28.20250416231148 h1:o8vKfK7PoV2W+JV5XURPRDCUTiIJBUSCiRV5GxqcxHk= -github.com/qydysky/part v0.28.20250416231148/go.mod h1:wp71PQdKYcg9jn9yDDvqC4shS/kzejyvFqbfUxuHocY= +github.com/qydysky/part v0.28.20250424194925 h1:DzhiRrcSn3ptsE8GElF8hfVvjCB000fpk1/+1HKnEHA= +github.com/qydysky/part v0.28.20250424194925/go.mod h1:wp71PQdKYcg9jn9yDDvqC4shS/kzejyvFqbfUxuHocY= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -- 2.39.2