[Golang] AES加密实作:钥匙圈

引言

我们的生活中都离不开各种的应用程式,这意味着我们要记忆更多帐号密码。虽然 Google 有密码管理工具,但是否遇过浏览器所记录的密码全都消失的情况吗?或者使用第三方登入时却忘记使用哪个应用程式的帐号?现在就让我们开始製作安全且方便的钥匙圈。

专案建立

首先,从钥匙圈样品 Clone 到本地端。接下来,通过执行以下指令,就可以轻鬆拥有一个本地端的服务:

docker-compose up --build

专案介绍

使用 AES 加密技术,轻鬆的保护帐号密码。对此专案的加解密流程有兴趣的话可以参考这个档案。如果想深入了解加密原理,请查看其他专业的加密原理文章。

1.加密

以下是一个加密请求的範例,依照範例格式填入想被保护的帐号密码。在加密过程中会需要一个金钥,然而在此专案中会根据 Config 金钥的长度而自动生成。

curl --location --request POST '127.0.0.1/api/v1/keychains/encryption' \--header 'Content-Type: application/json' \--data-raw '{    "keys": [        {            "application": "google.com",            "account": "admin",            "password": "password"        },        {            "application": "facebook.com",            "account": "root",            "password": "password"        }    ]}'

加密后会取得密文以及刚刚自动生成的金钥,请务必保管好这两样,少了一样或是有错误解密都会解不出来唷!

{    "Code": "ge1DE/GRtdScYh93apUR1UxXLE3m7uB+pUPHd0ajWMc9S9wildVS07fxougKM7WRknQsOVO0356MmCDwmG30tk6r3R24Eyxoh/2CNiqCAkNf2QLcAa1kmzjbCYUr/DMyUWXzk6ElCMTMbRjWJTuihtwGnUOum/C10Rq3NLQKzB0TCxp5byLLkIM93sTAaoNkLFAzU+NgneyOSocekzWGdWvUYoC7",    "Secret": "UTjvkFMK27TBItjpUVzLoKijq0zzswEt"}

2.解密

解密只需将加密后的结果填回去,即可获得原文。

curl --location --request POST '127.0.0.1/api/v1/keychains/decryption' \--header 'Content-Type: application/json' \--data-raw '{    "code": "ge1DE/GRtdScYh93apUR1UxXLE3m7uB+pUPHd0ajWMc9S9wildVS07fxougKM7WRknQsOVO0356MmCDwmG30tk6r3R24Eyxoh/2CNiqCAkNf2QLcAa1kmzjbCYUr/DMyUWXzk6ElCMTMbRjWJTuihtwGnUOum/C10Rq3NLQKzB0TCxp5byLLkIM93sTAaoNkLFAzU+NgneyOSocekzWGdWvUYoC7",    "secret": "UTjvkFMK27TBItjpUVzLoKijq0zzswEt"}'
{    "keys": [        {            "application": "google.com",            "account": "admin",            "password": "password"        },        {            "application": "facebook.com",            "account": "root",            "password": "password"        }    ]}

总结

AES 加密技术会根据明文的长度而变长,因此尽量把原文的结构变得更精简一些,可以获得更简短的密文。喜欢的朋友也可以下载来自己改造一番变成自己的钥匙圈样式。

最后分享身为 Golang 新手这次遇到的一些问题:

context.JSON 如果直接塞 []byte 型态的话会自动 base64 encode,所以当你拿到资料的话要自己 base64 decode 才会是原来的 []byte。Request 是 form-data 提交的话 context.ShouldBind 无法正确将 keys[0][application],keys[1][application],...等参数转成 Keychain type,所以最后才决定用 json 处理。

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章