一. 密码算法分析
1Panel源码开源于 GitHub - 1Panel-dev/1Panel: 🔥 🔥 🔥 现代化、开源的 Linux 服务器运维管理面板。
- 加解密算法代码位置:
/backend/utils/encrypt/encrypt.go
- 加密算法代码:
// 部分非核心代码不在此列出
func StringEncrypt(text string) (string, error) {
key := global.CONF.System.EncryptKey
pass := []byte(text)
xpass, err := aesEncryptWithSalt([]byte(key), pass)
if err == nil {
pass64 := base64.StdEncoding.EncodeToString(xpass)
return pass64, err
}
return "", err
}
func aesEncryptWithSalt(key, plaintext []byte) ([]byte, error) {
plaintext = padding(plaintext, aes.BlockSize)
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[0:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
return nil, err
}
cbc := cipher.NewCBCEncrypter(block, iv)
cbc.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
return ciphertext, nil
}
- 由代码可知,使用了
AES CBC
加密算法 - 经查找,
EncryptKey
默认存储于SQLite3数据库/opt/1panel/db/1Panel.db
的setting表中
二. 解密程序实现
- 在源码
/backend/utils/encrypt/encrypt.go
中,已给出了解密方法StringDecrypt(text string)
- 对
StringDecrypt
方法修改key为数据库中的值,即可正常解密
三. 终端下获取密码
- 使用默认安装的
1pctl
终端工具,可直接获取明文密码 1pctl user-info
四. 建议
- 在AES加密前,使用MD5/SHA256等哈希算法对明文密码进行第一轮加密,避免明文密码的直接解密
- 终端工具可以给出密码重置功能,但不建议可直接获取明文密码.
- 源码
/backend/utils/encrypt/encrypt.go
中已经定义了func Md5(str string) string
方法,为啥没用?