如何在Ubuntu上创建一个基于命令行的密码保护程序
如何在Ubuntu上创建一个基于命令行的密码保护程序
赵珂, cn.zhaoke.com
http://blog.zhaoke.com/95.html
2007年3月18日
http://blog.zhaoke.com/data/2007/0318/locker.jpg
介绍
本文主要介绍在Ubuntu Linux上如何创建一个简单的脚本来保护您的密码信息. 脚本由Duane Odom编写, 使用了Dialog会话和GnuPG密码程序. 大致的过程是: 首先运行脚本, 然后屏幕显示一个对话框, 用户要求输入主口令, 然后解密指定文件的所有信息, 接下来在文本编辑器中打开文件. 当编辑器关闭后, 脚本重新加密密码文件.
平台: Ubuntu 6.06 LTS
# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=6.06
DISTRIB_CODENAME=dapper
DISTRIB_DESCRIPTION=”Ubuntu 6.06 LTS”
工具: Dialog和GnuPG
Dialog是一个基于ncurses库的图形工具, 提供文本消息和输入对话框服务. GnuPG是一个开源版的OpenPGP标准实现.
我的Ubuntu系统确省安装了GnuPG, Dialog包没有发现, 安装Dialog:
# apt-get install dialog
Reading package lists… Done
Building dependency tree… Done
The following NEW packages will be installed:
dialog
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 201kB of archives.
After unpacking 1204kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com dapper/universe dialog 1.0-20060101-1 [201kB]
Fetched 201kB in 1s (104kB/s)
Selecting previously deselected package dialog.
(Reading database … 11772 files and directories currently installed.)
Unpacking dialog (from …/dialog_1.0-20060101-1_i386.deb) …
Setting up dialog (1.0-20060101-1) …
在分析脚本之前, 我使用命令gpg –gen-key创建了一个加密密钥(整个命令过程请参考gpg_genkey.txt). 屏幕提示可选的密匙类型. 一些密钥被注明只能签名”Sign only”, 但是我需要使用密匙来加密数据, 所以选择了”DSA和Elgamal(两种不同原理的非对称密钥算法), 生成的密钥可以同时用作签名和加密两种用途. 接下来的步骤一个重要的地方是记住填写的用户名(将用于数据加密).
当成功创建好密钥后, 我建立了一个口令文件, 然后加密口令文件. 首先建立了一个passwords文本文件, 然后输入了一些网址和口令, 保存退出. 最后, 运行gpg -e -r “Ken Zhao” passwords
# vi passwords
# cat passwords
cat passwords
Ken Zhao, http://zhaoke.com
# gpg -e -r “Ken Zhao” passwords
# ll
total 8
-rw-r–r– 1 root root 27 Mar 18 06:08 passwords
-rw-r–r– 1 root root 625 Mar 18 06:10 passwords.gpg
我们看到生成了一个使用”Ken Zhao”加密的passwords.gpg文件, 然后删除没有加密的passwords文件(也可以不删除, 密码保护脚本执行后将自动删除passwords文件).
到现在为止, 我创建了GnuPG Key密钥和加密的passwords口令文件. 接下来分段介绍passwd_locker脚本.
第一行(见片段1)使用命令tempfile创建了一个临时文件名. 第二行确保脚本无论怎样退出, 临时文件都将被删除. 第三行使用dialog程序向用户提供GnuPG验证窗口和重定向到dialog的标准错误, 标准错误使用户可以通过脚本输入数据到tempfile的实际文本. dialog命令使用返回值告诉你用户是否选择了”Ok(确认)”按钮, “Cancel(取消)”按钮或者程序发生了错误. 如果键入”Ok”, 返回值为0. 如果键入”Cancel”, 返回值为1, 如果程序出现错误或者用户选择了”Esc(退出)”键的话, 返回值为-1.(正如dialog的Man帮助页说到, 大多的shell脚本不能区分-1到255, 所以脚本使用了255).
片段1
http://blog.zhaoke.com/data/2007/0318/passwd_locker_p1.txt
下面重要的一行是密码文件的加密. 我使用cat命令把口令信息从文件传送到gpg, 并使用了–passphrase-fd 0参数:
片段2
http://blog.zhaoke.com/data/2007/0318/passwd_locker_p2.txt
接下来的一行是用户在编辑程序中打开没有加密的口令文件. 然后脚本等待用户的终止(编辑完成后退出脚本编辑程序), 然后下面的一行再次加密口令文件. 最后的一行是从系统上删除没有加密的口令文件:
片段3
http://blog.zhaoke.com/data/2007/0318/passwd_locker_p3.txt
使用passwd_locker脚本查看口令文件
1. 列出passwd_locker所在目录的所有文件
# ls
passwd_locker passwords passwords.gpg
2. 运行passwd_locker脚本
# ./passwd_locker passwords
3. 输入密码保护程序的主密码
http://blog.zhaoke.com/data/2007/0318/f1.gif
4. 解密passwords.pgp文件, 在当前目录创建一个passwords文件, 由于原passwords文件存在, 所以重写passwords.
http://blog.zhaoke.com/data/2007/0318/f2.gif
5. 查看或修改passwords文件内容.
http://blog.zhaoke.com/data/2007/0318/f3.gif
6. 最后运行
# ls
passwd_locker passwords.gpg
我们看到password文件已经被自动删除.
上面脚本稍作修改后还可用于存储其它文档, 图片, 演示文稿等. 加密后也可以方便地编辑内容. 如果你有大量的文件需要加密, 可以考虑使用TrueCrypt创建一个虚拟加密盘(在系统上加密盘是一个文件, 我们可以像实际的磁盘一样加载使用).
当然你可能从来就不会盲目地相信其它任何人的脚本. 特别是涉及到你的数据安全, 更多的信息可以参考gpg和dialog的man帮助页.
参考
How to create a command-line password locker
备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.