"database/sql"
_ "embed"
"encoding/json"
+ "encoding/pem"
"errors"
"flag"
"fmt"
"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"
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)
}
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"
)
clog = c.C.Log.Base(`cookie加密`)
pub []byte
pri []byte
+ cookie []byte
cookieLock sync.RWMutex
+ sym = pcs.Chacha20poly1305F
)
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 {
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]))
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 {
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)
+ }
}
}
还支持登录、搜索主播直播间、查看历史记录、查看关注的直播间、保存直播流等功能
#### 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`中可找到配置项
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解密私钥中使用
```
------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
------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
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
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=