Linux 密码管理

2020-04-23 linux

简单介绍下 Linux 中的密码管理。

简介

常见的加密工具有,seahorse(gnome-keyring)、Password Safe、LastPass (跨平台的密码保存工具)、keepass (跨平台的密码保存机制),在 CentOS 中可以通过 yum install keepassx 安装。

建议使用 keepass,这样只需要记住密码和对应的库文件即可,然后可以在其它平台上打开。

gnome-keyring 官网中,包括了详细的介绍。

加密方法

通常来说,密码算法都是公开的,保密应该依赖于密钥的保密,而不是算法的保密。

对称加密,密钥可同时用于加解密,一般密钥会直接出现在加密代码中,破解的可能性相当大,而且系统管理员很可能知道密钥,进而算出密码原文。由于密钥需要保密,因此需要事先秘密约定,或者用额外的安全信道来传输。

非对称加密,密码的安全性等同于私钥的安全性。密码明文经过公钥加密,要还原密码明文,必须要相应的私钥才行。因此只要保证私钥的安全,密码明文就安全。

Python Keyring

在 Python 中,密码保存以及获取可以使用 keyring 模块,可以从 pypi keyring 上下载,可以简单通过 easy_install keyring 或者 pip install keyring 安装。

>>> import keyring
>>> keyring.set_password("system", "username", "password")
>>> keyring.get_password("system", "username")
'password'

>>> keyring.get_keyring()                                              // 查看当前使用的keyring
>>> keyring.set_keyring(keyring.backends.file.PlaintextKeyring())      // 设置keyring

对于 PlaintextKeyring,实际上只是通过 base64 保存,该值可以很容易解密;加密后的文件保存在 ~/.local/share/python_keyring/keyring_pass.cfg 文件中。

[system]
username = cGFzc3dvcmQ=

可以直接通过 base64.decodestring('cGFzc3dvcmQ=') 解密。

如果要使用强密码加密措施,可以安装 pycrypto 模块,从官网下载,然后安装。

# python setup.py build && python setup.py install

>>> import keyring
>>> keyring.set_keyring(keyring.backends.file.EncryptedKeyring())      // 设置keyring

加密后的文件会保存在 ~/.local/share/python_keyring/crypted_pass.cfg 文件中。

其它

简单介绍其它的密码保存方式。

MySQL

MySQL 的认证密码有两种方式,在 4.1 版本之前是 MySQL323 加密,之后的版本采用 MySQLSHA1 加密。

mysql> select old_password("test");                                      // 老版本加密方式
mysql> select password("test");                                          // 新版本加密方式

mysql> select user, password from mysql.user;                            // 查看mysql中的应用名和密码
mysql> update user set password=password('password') where user='root';  // 更新密码
mysql> flush privileges;                                                 // 刷新权限

其中密码保存在 mysql/user.MYD 文件中。

Chrome FirFox

两者都会保存密码,并在需要的时候自动填充。

Chrome 密码管理器的进入方式:右侧扳手图标 → 设置 → 显示高级设置 → 密码和表单 → 管理已保存的密码;或者直接在地址栏中打开 chrome://chrome/settings/passwords;Chrome 后端会用一些系统提供的密码保存方式,不同平台有所区别,如 Linux 中是 gnome-keyring 。

FireFox 通过自己的方式保存密码,可以设置主密码,通常密码保存在 key3.db 中,如在 CentOS 中,保存在 ~/.mozilla/firefox/cud38a2f.default/key3.db,可以参考 密码管理器–在 Firefox 中记住、删除和更改已保存的密码

John the Ripper

一个开源的密码破解工具,可以参考 官方网站

$ tar -xvf john-1.8.0.tar.xz && cd john-1.8.0/run
$ ./john --test

# unshadow /etc/passwd /etc/shadow < mypasswd
$ ./john mypasswd

通过 make 可以查看所支持的系统,当然可以 make clean generic 产生通用的程序产生通用的程序产生通用的程序,产生的程序保存在 ../run 目录下,可以通过 john --test 测试。

使用OpenSSL加密

----- 使用Base64编码方法(Base64 Encoding)进行加密/解密
$ echo "Welcome to Linux" | openssl enc -base64
$ echo "V2VsY29tZSB0byBMaW51eAo=" | openssl enc -base64 -d

----- 使用对称加密
$ echo "Welcome to Linux" | openssl enc -aes-256-cbc -a         加密,需要秘密
enter aes-256-cbc encryption password: 123456
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX1+yYQz9vEKnm56GoXo7F3I/kHP2C5KW4lqBcneAeDIXa6WU29pYhPAL
$ echo "U2FsdGVkX1+yYQz9vEKnm56GoXo7F3I/kHP2C5KW4lqBcneAeDIXa6WU29pYhPAL" | openssl enc -aes-256-cbc -d -a
enter aes-256-cbc decryption password: 123456
Welcome to Linux

----- 输出到文件,然后解密
$ echo "OpenSSL" | openssl enc -aes-256-cbc > openssl.dat
$ openssl enc -aes-256-cbc -d -in openssl.dat
----- 加密文件
$ openssl enc -aes-256-cbc -in /etc/services -out services.dat
$ openssl enc -aes-256-cbc -d -in services.dat > services.txt
----- 加密文件夹
$ tar cz /etc | openssl enc -aes-256-cbc -out etc.tar.gz.dat
$ openssl enc -aes-256-cbc -d -in etc.tar.gz.dat | tar xz

----- 使用公私钥非对称加密
------- 1. 生成私钥,1024指定长度(bit),默认512
$ openssl genrsa -out test.key 1024
Generating RSA private key, 1024 bit long modulus
.......++++++
....................................++++++
e is 65537 (0x10001)
------- 2. 生成公钥
$ openssl rsa -in test.key -pubout -out test_pub.key
writing RSA key
------- 3. 使用公钥加密,-in(要加密文件) -inkey(公钥) -pubin(用纯公钥文件加密) -out(加密后文件)
$ openssl rsautl -encrypt -in hello.txt -inkey test_pub.key -pubin -out hello.en
------- 4. 使用私钥解密,-in(被加密文件) -inkey(私钥) -out(解密后文件)
$ openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de

参考