1Panel登录密码分析及建议

一. 密码算法分析

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

四. 建议

  1. 在AES加密前,使用MD5/SHA256等哈希算法对明文密码进行第一轮加密,避免明文密码的直接解密
  2. 终端工具可以给出密码重置功能,但不建议可直接获取明文密码.
  3. 源码/backend/utils/encrypt/encrypt.go中已经定义了func Md5(str string) string方法,为啥没用?

感谢您的建议,我们会在近期发布的版本中优化。

1 个赞