]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Add Cookie加密支持mlkem (#194)
authorqydysky <qydysky@foxmail.com>
Fri, 25 Apr 2025 13:28:31 +0000 (21:28 +0800)
committerGitHub <noreply@github.com>
Fri, 25 Apr 2025 13:28:31 +0000 (21:28 +0800)
* Add Cookie加密支持mlkem

* Improve cookie文件读取解密仅发生在启动时

* Improve 优化说明

* Improve 使用复制而非引用

* Improve 更新说明

CV/Var.go
F/CookieCrypo.go
README.md
demo/private.pem
demo/public.pem
go.mod
go.sum

index 196e17a33453b65035573255c3d4c934fac0795a..e152a971b8d00b5435e94fd81a1cd84948e475a0 100644 (file)
--- 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)
                }
index e82b658d99bed8049d90478b772f26f53126b3a5..5a37f935a4423680ad02fe131527d4cf4b143281 100644 (file)
@@ -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)
+               }
        }
 }
 
index 4ec80d9aa1d3de7c7056654be895ee2f65d5651d..bf797df84e0e11a2175785789fddb397e542cbeb 100644 (file)
--- 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解密私钥中使用
 ```
index 679fb4c238f83f3f1215bd136c9e6e4852cdbb6d..26533066328b477f96eb96cdd51f8f6e5160f76a 100644 (file)
@@ -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
index 2780b61358763923c6738a9bf4b15ce591ff083c..fbbde2a29e719bdb5630dfcd404135336b025f7d 100644 (file)
@@ -1,3 +1,35 @@
------BEGIN ECDH PUBLIC KEY-----
-JAyDXPJ2jNouYCC1xp51RRvAhCYrohCN/5ZhOgDbW2c=
------END ECDH PUBLIC KEY-----
\ No newline at end of file
+-----BEGIN MLKEM PUBLIC KEY-----
+4QlSf7AqLsc/V3G4RLFQLBlSweQ3jsR75cxDZwTI2FW0dSYbe3gO4NQEfsa66HKZ
+/JN7xoSYm1hfYMlbA6EZPqZ5L3zGmpI7MjcMWtlO3xUzrmWlAnIlg1tSqElN5qJJ
+IhWCK/a3uPJB5ndfU2oAeZcbVpAq7WQKDbpkW9xtucJ3DhQ2KNIBRGyAV3QE7wte
+wfenoTdshnEBtbSl7xum47kq1oPJBEgwXVu1hsd0KmBecUalmelljgLHa1cSsPyk
+f0tJKTnBclcizHSgGXYyOoZ1NUo6oFF3f0IF/ZmDu4qLVEF9KDRv0Ap8GIPLMsgO
++bo5JGQ8q6vBIdAF3VJCTvSBgymbYiKjwaVliVk5RIzHyTBOJpa67HNxTfYONRlG
+Ayt3a7WTc3RqJ1RhRwuOJpUlT1YHcyI1c7DLH2w5W+kjS+krXaOL9rR9MUdOiSlz
+ltLPLUUbcMUvYoXLYQB6tAJUeRVfSnoRxpY73wGvbSylg/q6wIU+cnqYmVVr/MMT
+XpQ0uTUgxseaICd9fDpADlFSN8o6tQKxfPlukdWbXoRuXTdTXxo+TCyeTFqd34Zn
+06CK9UuJ0ZUT8KNJkVpCLdhDSggwwEtx95uou9xidAqqlgUoQlJjwNGmIXq6ysyQ
+U0OKMwySzBhjXnvNhZK0VfgMknCIETt+2ghyxOjCv3kYQhV/I3mSQZBEg+HHXLtp
+bxpnZUvP6SDB6iMYHXSYYhNelvBwJYNtxkA/ajGRG/ZUIXZZ6KyfoPeWI0BK5al1
+CMNyFFqguTdx1Ce4kXlvDfyQWTtRYni35wJPS3swu/S3O6oGBFA184IFWjSk5SEo
+GHY9GLVcANspw2sQ7ekLAKtPThgFQMF+SpekacOIkTpHu6o8DFfAzLMmmOXJ2YjJ
++Rwr/RfDTzs3YHAWN0qwrGcpa1K8jcKD56yLANkv9adwH4EY/MxK6MYMButmszjG
+dWonYGo2goLAIhQ75QPLJZmNDNdXiOnJRdkDaYPC7aGlWonJQjq9/AlNLtyxwtS+
+WzxrYPINE5IyDgU3q8qOI1Y/TDkSGPoxZaSEOJBpV/SCM8RXjkzNlUOm2ds8KKDB
+hzgxB4CKutO49dd0OwInXYIUdVt21oFLkNKyDMmQkUO1XAO9kGIGK7tJS/aS99xW
+ZeZUZQUHHEuIg8K91Wshyye50SNhD7gO87dFdJdnyMactqNZwVQvh7XNNIZZoGIc
+ZIN50bALTfcLXDiOQ5eWbScJs/hfJERotWiRIvxO8wobdhF1SMFGAB3NYgUnz8Q6
+IPaz81V0AuKIx6ZQZrGqA/mm1Xty4TyUSEVl2tpnpvDChVBsAvGSkFN4bQoHGyzA
+N8l5jXtrB+Ca2FXFolsJgWSD2wLAtYyj/mU3vnVy9snF4iy1OOQ3n1uP/Bp8b2YU
+x/Mv4ylw34EPpTErgZfO4ja/9rNbdokeITaHOnAZJZzOX1pEITuJtqtukdcODsAL
+ZcYoNOBdnweG9rgwUGHM4AWLI+EM9HsAO3oSLdUJ8ge2HRYLxpSia6xoPhOx2cqS
+iQCHu7IoSoysf9QMHFmXCNO9OxBenrAV7IIPQSh2RHYqaotYMXyz+MiXUmlDETku
+zyOt2atvDsfEB0Z5yzOUSfoOEIa/o5LBN9TKySIohawLWHXC2+EL33fBlzRYcUY9
+9ffONvsxBss9tvK+7SkQgiiBKpOmMaZoHOxaHbxRbhIO/aCBGYpuKVWi2DSMDOhK
+11WgsGONzcqG2Mw5RaARuERZuAKf4QiOVqQfhnWwpPcPjpdRKLxrxNLNKMY8yjca
+UVVAfFyMz4SEcgHIZFjPdQESDAdAcYTD6PouoaWntcZYbIrMJAATscckjANQppvB
+XHyostVjsrV+sTgQPyRI/3FDM7sGTdtsQNdW2BfL6tuoniHBjOfNp1MaJjKHH6NU
+1UiX6FSUI8RoSyorXQVKN2TPgPwLrtTE7DRWUDwcCBGdVrNumJLKlcxkT6C0f2hE
+PFy/UAyfthgPbDnLFwAOs/uUfqRUywWOdylikksyurpUvOVwM2iyJppXn0izt4mh
+ZSU9MJ4PpvI6wolTQhTSJQoiK4CKgqvF4Yq6pwD9Fi0=
+-----END MLKEM PUBLIC KEY-----
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 39e6df16e2ff192175ec416f0e01a46eb85e96d0..6daf7fb1c091f09bf22976dd75ef1a499a8ff67a 100644 (file)
--- 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 68196bcb915ed24413c100e26a189804e24fa1da..23f9249492f478bf62ee2bdc9dea825ad55eb6d2 100644 (file)
--- 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=