go-dongle 1.1.1 版本发布,一个轻量级、语义化的 golang 编码解码、加密解密库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
gouguoyin
V2EX    Go 编程语言

go-dongle 1.1.1 版本发布,一个轻量级、语义化的 golang 编码解码、加密解密库

  •  
  •   gouguoyin
    kuafuRace 47 天前 1840 次点击
    这是一个创建于 47 天前的主题,其中的信息可能已经有所发展或是发生改变。

    dongle 是一个轻量级、语义化、对开发者友好的 Golang 编码解码和加密解密库

    Dongle 已被 awesome-go 收录, ,并获得 gitee 2024 年最有价值项目(GVP)和 gitcode 2024 年度 G-Star 项目,如果您觉得不错,请给个 star 吧 github.com/dromara/dongle

    gitee.com/dromara/dongle

    gitcode.com/dromara/dongle

    更新日志

    • [refactor] 对称加密算法从 ByXXX(cipher.XXXCipher) 改成 ByXXX(*cipher.XXXCipher)

    • [refactor] 将工具包名从 utils 改成 util

    • [refactor] 编码/解码、加密/解密、Hash/Hmac 、签名/验签支持真正的流式处理

    • [refactor] 当输入数据为空时,直接返回空数据而不执行后续操作

    • [feat] 增加 ED25519 数字签名和验证支持

    • [feat] 增加 SM3 哈希算法支持

    • [feat] 增加 mock/hash.go 来模拟 hash.Hash 接口的错误

    • [feat] coding/morse/morse.go 增加对空格、标点符号和特殊字符的支持

    28 条回复    2025-10-05 19:36:34 +08:00
    DefoliationM
        1
    DefoliationM  
       46 天前
    这个意义是?除了 sm2/sm3 这不标准库都有的吗?
    gouguoyin
        2
    gouguoyin  
    OP
       46 天前
    @DefoliationM 封装标准库的复杂细节,统一的对外输出 api ,同时保持灵活性和性能,所有方法原生支持流式处理,可直接处理大文件或流数据的编码 / 加密,同时补充标准库不支持的算法,比如标准库 aes 支持的填充模式和分块模式不够全面,在与其他语言对接时可能需要自己实现填充模式和分块模式。
    gouguoyin
        3
    gouguoyin  
    OP
       46 天前
    再比如标准库 rsa 中私钥密钥需要是 pem 格式的,而在实际对接中往往给的是一长串字符串,需要自己转换成 pem 格式,pem 还分 pkcs#1 和 pkcs#8 格式
    chennqqi
        4
    chennqqi  
       46 天前
    相比原生库有什么优势?使用它的理由是什么?
    iyaozhen
        5
    iyaozhen  
       46 天前
    @gouguoyin #2 该说不说 aes padding 确实烦,之前一个 aes 加密要和 java/android 、swift 、c++、php 、js 对接,搞死我了
    seers
        6
    seers  
       46 天前
    挺好的,用过 go 的 crypto 库的都知道,原生库太原始了,啥都要自己搓,涉及到加密又怕漏了啥 corner case 直接就是严重漏洞
    gouguoyin
        7
    gouguoyin  
    OP
       46 天前
    @chennqqi 原生库过于原生,使用起来繁琐,心智负担重,并且分散在多个包中,一部分算法在标准库中,一部分在`golang.org/x/crypto`, `dongle`包中, 则将这些功能整合为统一接口,通过 `Encode`、`Decode`、`Hash`、`Encrypt` 等入口即可完成所有操作,无需记忆多个包的细节。例如,Md5 哈希算法在原生标准库中需要手动处理哈希对象创建、数据写入、摘要计算及结果转换,而 dongle 只需一行代码:
    ```go
    dongle.Hash.FromString("hello world").ByMd5().ToHexString()
    ```
    对于像 aes/rsa 等复杂点的算法,节省的代码量更不是一星半点,以 dongle 里 `aes` 为例
    ```go
    import "github.com/dromara/dongle/crypto/cipher"

    c := cipher.NewAesCipher(cipher.CBC)
    // 设置密钥( 16 字节)
    c.SetKey([]byte("dongle1234567890"))
    // 设置初始化向量( 16 字节)
    c.SetIV([]byte("1234567890123456"))
    // 设置填充模式(可选,默认为 PKCS7 )
    c.SetPadding(cipher.PKCS7)

    dongle.Encrypt.FromString("hello world").ByAes(c).ToHexString()
    ```
    如果换成原生库实现需要多少代码量
    gouguoyin
        8
    gouguoyin  
    OP
       46 天前
    以非对称加密算法 rsa 为例,dongle 只需要以下几行,如果都使用默认,只需要 3 、4 行代码

    kp := keypair.NewRsaKeyPair()
    // 设置密钥格式(可选,默认为 PKCS8 )
    kp.SetFormat(keypair.PKCS8)
    // 设置哈希算法(可选,默认为 SHA256 )
    kp.SetHash(crypto.SHA256)
    // 设置公钥
    kp.SetPublicKey([]byte("公钥字符串"))
    // 设置私钥
    kp.SetPrivateKey([]byte("私钥字符"))

    dongle.Encrypt.FromString("hello world").ByRsa(kp).ToHexString()
    ZeroDu
        9
    ZeroDu  
       46 天前
    不错,golang 就是缺少各种工具集成,自带 api 都太原始难用了
    roundgis
        10
    roundgis  
       46 天前 via Android
    不错 刚好可以用到
    nszr
        11
    nszr  
       46 天前 via iPhone
    手搓过加解密的都知道里面有多少坑,直到用了这个库,一切都轻松了。没想到在 v2 看到作者了,必须说声感谢
    keepfun
        12
    keepfun  
       46 天前
    第一眼看成 go-dongge 了
    ruanimal
        13
    ruanimal  
       46 天前
    @ZeroDu 大道至简??
    gouguoyin
        14
    gouguoyin  
    OP
       46 天前
    @fenglangjuxu dongle 是英文加密狗的意思
    gouguoyin
        15
    gouguoyin  
    OP
       46 天前
    @roundgis 感谢支持,欢迎提出宝贵意见
    gouguoyin
        16
    gouguoyin  
    OP
       46 天前
    @nszr 这个库也是自己因为在实际业务对接中踩过的坑太多,但是又没有成熟的第三方密码库,因此才封装集成该库,方便自己以后对接中使用,同时开源希望给同样踩过坑的 v 友们带来方便,也算是反哺 go 生态。dongle 每一个算法都以 golang 标准库和 python 权威库作为基准数据进行过核验校对。
    gouguoyin
        17
    gouguoyin  
    OP
       46 天前
    @seers 实践出真知
    apkapb
        18
    apkapb  
       46 天前
    readme 要不让 AI 优化下呢

    现在感觉有点 chinglish ,排版也不吸引人。

    让 AI 优化下,添加些 emoji ,会好很多
    gouguoyin
        19
    gouguoyin  
    OP
       46 天前
    @apkapb readme 只是简单介绍下用法,详细的在 https://dongle.go-pkg.com/ ,该文档是由 claude code 翻译的
    mightybruce
        20
    mightybruce  
       46 天前
    没有经过国际安全机构或者中国的机构认证,看不出安全性保证。

    比如 FIPS 140-2 ,FIPS 140-3
    cnbattle
        21
    cnbattle  
       46 天前
    dromara 的.... carbon 库接手后,在 v2 版本下做了一些不兼容的变动,有些不好的印象
    gouguoyin
        22
    gouguoyin  
    OP
       46 天前
    @cnbattle carbon v1 和 v2 一个是值传递,一个是指针专递,有一些没办法兼容或者兼容需要大量的冗余代码
    gouguoyin
        23
    gouguoyin  
    OP
       46 天前
    @cnbattle 在开发 v1 版本时 go 还没有泛型,v2 后开始支持泛型,使用泛型重构,确实没办法兼容 v1 版本
    gouguoyin
        24
    gouguoyin  
    OP
       46 天前
    @mightybruce 感谢指正,我看看怎么进行国际安全机构或者中国的机构认证
    gouguoyin
        25
    gouguoyin  
    OP
       46 天前
    @mightybruce 通过查询资料,FIPS 140-2 已经停止接收申请,FIPS 140-3 认证需要从设计、开发到测试的全流程合规,建议组建包含安全专家、开发人员和文档专员的团队,并尽早与测试实验室沟通,以缩短认证周期。认证条件对于一个非商业的开源项目太苛刻了吧。
    cnbattle
        26
    cnbattle  
       46 天前
    @gouguoyin 是 v2.5 到 v2.6 ,小版本里 有不兼容的变动,不是大版本
    js2854
        27
    js2854  
       16 天前
    貌似 github.com/deatil/go-cryptobin/cryptobin/crypto 更好用点,链式的,如
    ```go
    cypten := crypto.FromString(d).SetKey(key).SetIv(iv).TripleDes().CBC().ZeroPadding().Encrypt()
    if err := cypten.Error(); err != nil {
    return nil, err
    }
    return cypten.ToBytes(), nil
    ```
    gouguoyin
        28
    gouguoyin  
    OP
       14 天前
    @js2854 这种链式调用有一点小弊端,链式方法是通用的,需要弄清楚哪些需要调用哪些不需要调用。比如有的分组模式是不需要填充,有的模式是不需要 iv ,有的模式需要 nonce ,有的加密方法可能只需要一个 key ,使用这种链式调用还需要查手册才能知道需不需要调用某个链式方法。而 `dongle 采用了每种加密方法创建一个 Cipher ,每种加密方法的 Cipher 都有自己独有的设置方法,这与 golang 的标准库保持一致,如 `golang` 标准库中 `aes.NewCipher()`
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5644 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 08:16 PVG 16:16 LAX 01:16 JFK 04:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86