背景
NKN的web-gui即dashboard模块,在通信过程中,有参数的HTTP包都会进过一次AES对称加密。
像这样
POST /api/wallet/open HTTP/1.1
Host: 192.168.1.100:30000
Content-Length: 63
Accept: application/json, text/plain, */*
Unix: 1588221168
Origin: http://192.168.1.100:30000
Content-Type: application/json;charset=UTF-8
Cookie: i18n_redirected=en; session=MTU4ODIyMTE2M3xRY2VaUnlSclQ1V3lOUllOSzAzSHZnMWhaZkJPbWpELUVjSGZNcTdBVWpHNnZLa1lZakF6b08xbXlHUklLanVCWU9fWkJueThRY0VnVU1mWjBrbHNmWjVjTFY1bnAzZVBJZUFtM1l0ay02WjZtTkNmaTRTR1pCNkgtcWVZN2ZRd1B4TGZ8FlyZ4mfYPDAvX_64WpEYZxPLBMNqm4Zq9LwtHU3v0AI=
Connection: close
{"data":"3ddc98eb25e7f572a0294533187e0d24b0e71c76897f300ec8d6"}
这里加密的data内容,其实是wallet的密码,即webgui的登陆密码。
阅读源码后总结了一下加密密钥的协商和使用的实现方法。
解密函数
我们只研究接收者逻辑
DecryptData
func DecryptData(context *gin.Context, hasSeed bool) string {
...
seed := ""
wallet, exists := context.Get("wallet")
if exists && hasSeed {
passwordKeyHash := wallet.(*vault.WalletImpl).Data.PasswordHash
seedByte := sha256.Sum256(