iT邦幫忙

0

[Golang] AES加密實作:鑰匙圈

  • 分享至 

  • xImage
  •  

引言

我們的生活中都離不開各種的應用程式,這意味著我們要記憶更多帳號密碼。雖然 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 處理。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言