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 · 19 小时 54 分钟前 · 828 次点击

    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 增加对空格、标点符号和特殊字符的支持

    25 条回复    2025-09-04 11:38:08 +08:00
    DefoliationM
        1
    DefoliationM  
       16 小时 16 分钟前
    这个意义是?除了 sm2/sm3 这不标准库都有的吗?
    gouguoyin
        2
    gouguoyin  
    OP
       16 小时 2 分钟前
    @DefoliationM 封装标准库的复杂细节,统一的对外输出 api ,同时保持灵活性和性能,所有方法原生支持流式处理,可直接处理大文件或流数据的编码 / 加密,同时补充标准库不支持的算法,比如标准库 aes 支持的填充模式和分块模式不够全面,在与其他语言对接时可能需要自己实现填充模式和分块模式。
    gouguoyin
        3
    gouguoyin  
    OP
       15 小时 50 分钟前
    再比如标准库 rsa 中私钥密钥需要是 pem 格式的,而在实际对接中往往给的是一长串字符串,需要自己转换成 pem 格式,pem 还分 pkcs#1 和 pkcs#8 格式
    chennqqi
        4
    chennqqi  
       14 小时 20 分钟前
    相比原生库有什么优势?使用它的理由是什么?
    iyaozhen
        5
    iyaozhen  
       14 小时 8 分钟前
    @gouguoyin #2 该说不说 aes padding 确实烦,之前一个 aes 加密要和 java/android 、swift 、c++、php 、js 对接,搞死我了
    seers
        6
    seers  
       13 小时 18 分钟前
    挺好的,用过 go 的 crypto 库的都知道,原生库太原始了,啥都要自己搓,涉及到加密又怕漏了啥 corner case 直接就是严重漏洞
    gouguoyin
        7
    gouguoyin  
    OP
       12 小时 41 分钟前
    @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
       12 小时 17 分钟前
    以非对称加密算法 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  
       11 小时 21 分钟前
    不错,golang 就是缺少各种工具集成,自带 api 都太原始难用了
    roundgis
        10
    roundgis  
       2 小时 53 分钟前 via Android
    不错 刚好可以用到
    nszr
        11
    nszr  
       2 小时 33 分钟前 via iPhone
    手搓过加解密的都知道里面有多少坑,直到用了这个库,一切都轻松了。没想到在 v2 看到作者了,必须说声感谢🙏
    fenglangjuxu
        12
    fenglangjuxu  
       2 小时 9 分钟前
    第一眼看成 go-dongge 了
    ruanimal
        13
    ruanimal  
       2 小时 9 分钟前
    @ZeroDu 大道至简??
    gouguoyin
        14
    gouguoyin  
    OP
       2 小时 4 分钟前
    @fenglangjuxu dongle 是英文加密狗的意思
    gouguoyin
        15
    gouguoyin  
    OP
       2 小时 3 分钟前
    @roundgis 感谢支持,欢迎提出宝贵意见
    gouguoyin
        16
    gouguoyin  
    OP
       1 小时 56 分钟前
    @nszr 这个库也是自己因为在实际业务对接中踩过的坑太多,但是又没有成熟的第三方密码库,因此才封装集成该库,方便自己以后对接中使用,同时开源希望给同样踩过坑的 v 友们带来方便,也算是反哺 go 生态。dongle 每一个算法都以 golang 标准库和 python 权威库作为基准数据进行过核验校对。
    gouguoyin
        17
    gouguoyin  
    OP
       1 小时 55 分钟前
    @seers 实践出真知
    apkapb
        18
    apkapb  
       1 小时 0 分钟前
    readme 要不让 AI 优化下呢🤣

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

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

    比如 FIPS 140-2 ,FIPS 140-3
    cnbattle
        21
    cnbattle  
       39 分钟前
    dromara 的.... carbon 库接手后,在 v2 版本下做了一些不兼容的变动,有些不好的印象
    gouguoyin
        22
    gouguoyin  
    OP
       30 分钟前
    @cnbattle carbon v1 和 v2 一个是值传递,一个是指针专递,有一些没办法兼容或者兼容需要大量的冗余代码
    gouguoyin
        23
    gouguoyin  
    OP
       25 分钟前
    @cnbattle 在开发 v1 版本时 go 还没有泛型,v2 后开始支持泛型,使用泛型重构,确实没办法兼容 v1 版本
    gouguoyin
        24
    gouguoyin  
    OP
       24 分钟前
    @mightybruce 感谢指正,我看看怎么进行国际安全机构或者中国的机构认证
    gouguoyin
        25
    gouguoyin  
    OP
       刚刚
    @mightybruce 通过查询资料,FIPS 140-2 已经停止接收申请,FIPS 140-3 认证需要从设计、开发到测试的全流程合规,建议组建包含安全专家、开发人员和文档专员的团队,并尽早与测试实验室沟通,以缩短认证周期。认证条件对于一个非商业的开源项目太苛刻了吧。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5534 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:38 · PVG 11:38 · LAX 20:38 · JFK 23:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.