# 开源:助记词/私钥隐形存储工具—DKeyMask图片隐写

By [dgeek.eth](https://paragraph.com/@dgeek) · 2022-04-12

---

为什么要开源这个工具?
-----------

进入WEB3领域的第一件事情就是创建各种属于个人的钱包，然后按照指示保存好自己的各种助记词/私钥。基于现代密码学所构建的去中心化设施，保证了全世界除了你自己，没有任何人有任何办法可以挪用你的链上资产。**当然，这里面有且仅有一个前提——你的助记词/私钥没有泄露！**

那么问题来了，安全，高效的存储助记词/私钥就是一个令人头疼的问题，目前常见的解决方案有：

*   **手抄物理离线存储**，这种方案存储安全性最高，但存在遗忘/丢失/破损等风险，同时使用效率极低，每次使用时均需要重新手动输入，非常麻烦
    
*   **硬件钱包离线存储**，这种方案存储安全性同样很高，但也同样存在遗忘/丢失/损坏等风险，同时价格高昂，灵活性差
    
*   **软件二次加密存储**，这种方案使用效率很高，十分方便，但存储安全性依赖密码复杂度和软件漏洞，同时加密后的文件特征明显，从BTC时代开始，其实一直持续在发生有黑客攻击造成的加密防护失效事件
    
*   **多签分布式存储**，这种方案的核心思想是不要把鸡蛋放在一个篮子里，即将助记词/私钥文件拆分，分别存储在多个可用存储空间中，甚至包括本地，云盘，其他第三方中心化服务器等等。因为每个存储空间都只持有一部分的二次加密信息，所以安全性方面尚可，同时通过一定程度的冗余策略来防止某一个存储空间的失效导致的数据丢失。该类方案目前也有很多钱包在推进，但会存在一个存储系统过于复杂的问题，我们知道当一个系统的复杂度越高的同时，它面临的问题也会越多，包括但不限于信任/漏洞等等
    

**所以综合以上常见方案，会发现其实目前还并没有在各方面均能比较完美的助记词/私钥保存方案，既安全，又能防丢失，又能方便使用，又能费用低甚至免费**

LSB图片隐写原理
---------

我们知道，一张图片其实是由上百万乃至上千万的像素点构成的，然后每个像素点又是由RGB三个字节的数据组成，每个字节有8位，这里面最低的1位对整个颜色影响非常小，所以就可以利用来存储其他私密数据。这样每个像素就可以挤出3位存储空间，同时不影响图片外观。所以理论上差不多1MB的图片可以存储100kb的私密数据哦（实际会受限于图片的压缩比和PNG透明通道影响）

解决方案
----

出于这一点的思考，尝试对以上的方案三进行了一定程度的改良优化，即结合了LSB图片隐写术Steganography，**将助记词/私钥这类对安全度要求极高的数据，写入到一张png/jpg图片中**

该方案优点如下：

> _1、采用的是最低有效位LSB算法，对图片外观展示几乎没有影响_
> 
> _2、图片天生具有记忆关联性，不容易遗忘_
> 
> _3、信息藏于图片之中，具有很强的隐蔽性，除了你自己没有人能知道你把信息藏在哪一张图片中（虽然不鼓励也不赞成，但的确可以把图片保存在网络云盘的相册中，利用云存储的容灾保障）_
> 
> _4、信息二次加密，具有很强的安全性，即便他人遍历你的所有图片读取，也需要知道你的解密口令才能解码_
> 
> _5、使用效率高，需要使用助记词/私钥的时候，只需要读取对应图片和输入解密口令，即可解码使用，十分方便_

该工具展示如下，UI上非常简单，只有两个输入区域+两个按钮，分别是：

`passphrase`二次加密防护口令，通过高强度AES加密后再写入图片

`secret data` 准备要写入图片的私密数据

`READ`点击后从文件对话框中选择一张图片读取私密信息

`WRITE` 点击后从文件对话框中选择一张图片写入私密信息

![DkeyMask工具截图](https://storage.googleapis.com/papyrus_images/bd2989e1151a07da2b5ef58890ea8fd779dc6e5357514634a80400ac07070ec4.png)

DkeyMask工具截图

开源安全
----

当然，涉及到助记词/私钥这种可以称为最高安全级别的信息，我知道没有任何人会冒任何风险去使用一款第三方工具触碰它（不过的确有不少人会用1password或其他中心化的工具去保存管理……）

所以，出于真正的希望大家能保护好自己的助记词/私钥信息，亦或是有其他相关需求的朋友能放心使用，**DKeyMask的所有源码100%公开**，并且采用的是几乎最宽松的开源许可证—MIT License，以下是github链接：

[https://github.com/geekmask/dkeymask](https://github.com/geekmask/dkeymask)

> _该项目纯GO开发，同时为了降低技术复杂度和便于阅读理解，没有选择electron和其他复杂UI库，而是基于fyne（另一个纯GO可视化框架）构建的UI，主界面交互只有100行代码左右，十分简单。全部代码也只有3个文件，总共不超过500行，且纯本地执行，没有任何网络库使用请尽管放心…有能力的朋友可以自行go build，不了解编程的朋友我也打了release包在github上，支持windows和mac平台_

> _以下是代码目录结构，需要声明的是虽然网络上公开的Steganography图片隐写算法代码和库不少，但我个人试用了大部分之后发现都不同程度地存在有BUG或图片支持不完整，也缺少异常处理，完美结合了UI的更是几乎没有，所以花了较多精力重头理解LSB算法的实现并小幅度优化实现_

    ├── LICENSE
    ├── README.md
    ├── assets              // 资源文件夹，包含LOGO和工具截图
    │   ├── logo.png
    │   └── screenshot.png
    ├── core
    │   ├── aes.go         // 核心代码，AES加密实现
    │   └── ste.go         // 核心代码，图片隐写实现
    ├── go.mod
    ├── go.sum
    ├── main.go             // 入口文件，基于fyne的UI实现
    └── theme               // 主题文件，因为fyne默认不支持中文，
        ├── logo.go         // 所以打包了苹果的苹方字体
        ├── theme.go
        └── ttf.go
    

**如果它真的能够帮到你，也希望能不吝地留下一颗Star，毕竟这会是最大的鼓励了：）**

题外话
---

本人是一名简单的WEB3全栈开发者，当前有带一个专业团队，技术Leader，平时喜欢捣鼓各种乱七八糟但有意思的小东西。**希望在这个充满geek的世界里，以Builder的视角贡献自己一份力**，同时也下定决心开始写twitter，这个twitter定位于输出WEB3领域的纯干货技术产品。所以也就从自己的这一个小小创造开始吧，这是我的[twitter](https://twitter.com/geekfunc)

---

*Originally published on [dgeek.eth](https://paragraph.com/@dgeek/dkeymask)*
