简单介绍下 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
参考
- 安全审计工具可以参考 cisofy.com/lynis ; 关于破解工具可以参考 THC-Hydra 支持多种协议。
- 关于存储密码的方法可以参考 Storing User Passwords Securely: hashing, salting, and Bcrypt,一篇很不错的介绍数字签名的文章 What is a Digital Signature? 。