引言
我们的生活中都离不开各种的应用程式,这意味着我们要记忆更多帐号密码。虽然 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 处理。