linux下的加密软件非常多,如encfs、cryptkeeper(该工具是encfs的再包装)、cryptsetup luks 等,对于文件的加密,连vim也可以操作。但想找一个一般的发行版里都预装的,经常用到的工具来实现,于是就发现了openssl 。openssl是ssh、apache等众多软件的加密组件,所以几乎所有的发行版的unixlinux里都会预装 。

一、openssl相关参数

一直没找到查看openssl使用参数的方法,通过下面的方法给出了一个提示:

 1yang@yang-K40IE ~ $ openssl enc  -h
 2unknown option '-h'
 3options are
 4-in <file>     input file
 5-out <file>    output file
 6-pass <arg>    pass phrase source
 7-e             encrypt
 8-d             decrypt
 9-a/-base64     base64 encode/decode, depending on encryption flag
10-k             passphrase is the next argument
11-kfile         passphrase is the first line of the file argument
12-md            the next argument is the md to use to create a key
13                 from a passphrase.  One of md2, md5, sha or sha1
14-S             salt in hex is the next argument
15-K/-iv         key/iv in hex is the next argument
16-[pP]          print the iv/key (then exit if -P)
17-bufsize <n>   buffer size
18-nopad         disable standard block padding
19-engine e      use engine e, possibly a hardware device.
20Cipher Types
21-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
22-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb
23-aes-128-gcm               -aes-128-ofb               -aes-128-xts
24-aes-192-cbc               -aes-192-cfb               -aes-192-cfb1
25-aes-192-cfb8              -aes-192-ctr               -aes-192-ecb
26-aes-192-gcm               -aes-192-ofb               -aes-256-cbc
27-aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8
28-aes-256-ctr               -aes-256-ecb               -aes-256-gcm
29-aes-256-ofb               -aes-256-xts               -aes128
30-aes192                    -aes256                    -bf
31-bf-cbc                    -bf-cfb                    -bf-ecb
32-bf-ofb                    -blowfish                  -camellia-128-cbc
33-camellia-128-cfb          -camellia-128-cfb1         -camellia-128-cfb8
34-camellia-128-ecb          -camellia-128-ofb          -camellia-192-cbc
35-camellia-192-cfb          -camellia-192-cfb1         -camellia-192-cfb8
36-camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc
37-camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8
38-camellia-256-ecb          -camellia-256-ofb          -camellia128
39-camellia192               -camellia256               -cast
40-cast-cbc                  -cast5-cbc                 -cast5-cfb
41-cast5-ecb                 -cast5-ofb                 -des
42-des-cbc                   -des-cfb                   -des-cfb1
43-des-cfb8                  -des-ecb                   -des-ede
44-des-ede-cbc               -des-ede-cfb               -des-ede-ofb
45-des-ede3                  -des-ede3-cbc              -des-ede3-cfb
46-des-ede3-cfb1             -des-ede3-cfb8             -des-ede3-ofb
47-des-ofb                   -des3                      -desx
48-desx-cbc                  -id-aes128-GCM             -id-aes192-GCM
49-id-aes256-GCM             -rc2                       -rc2-40-cbc
50-rc2-64-cbc                -rc2-cbc                   -rc2-cfb
51-rc2-ecb                   -rc2-ofb                   -rc4
52-rc4-40                    -rc4-hmac-md5              -seed
53-seed-cbc                  -seed-cfb                  -seed-ecb
54-seed-ofb

上面列出的是主要的几个参数,下面列出来的是支持的加密类型 。几个参数的意义从E文上看也比较好理解,经常用到的也就四个参数

1-e/-d 加密/解密
2-in 要被加/解密的文件
3-out 被加/解密后的文件

二、密码加密

1、对普通文件加密和解密

加密

1openssl enc -aes-128-ecb -e -in myfile -out myfile-aes

解密

1openssl enc -aes-128-ecb -d -in myfile-aes -out myfile

2、通过配合tar压缩对文件夹加密和解决

1打包并加密文件夹
2tar czvf - yincan|openssl des3 -salt -k password -out yincan.tar.gz
3解密并解包文件夹
4openssl des3 -d -k password -salt -in yincan.tar.gz |tar zxvf -

该例中以des3加密方式,设置密码为password的方式加密yincan文件夹并将加密后的文件输出为yincan.tar.gz ,同样,解决的方法类似 。本例和例1中的除了加密方式不同外,使用-k参数,这样就免出了让提示输密码的麻烦 。这样可以方便以脚本的方式对mysql之类的敏感文件进行备份后进行保护 。

当然,上面的操作也可以分两步来完成,第一步先通过tar czvf yincan.tar.gz yincan 进行打包备份 。第二步再通过openssl des3 -salt -k 加密密码 -in $in.tar.gz -out $out.tar.gz 的方式加密。

三、密钥的方式加密和解密

使用密码时,难免会忘记。而且密码太简单时,加密强度可能也不够强,这时可以能过密钥的方式进行加密和解密 。

1、生成一个密钥:

1openssl genrsa -out test.key 1024

生成出来的文件是包含了公钥和密钥两部分的,即该文件即可以用于加密也可以用于解密 。这样的话也会很不安全,一旦服务器被入侵,别人就可以通过备份脚本找到key文件,并利用该文件进行解密。

所以更好的方法是将公钥从中剥离出来,用于加密(仅能用来加密,无法用来解密 ),另外的一个文件(包含 公钥和私钥的文件)进行解密 。

2、提取公钥

1openssl rsa -in test.key -pubout -out test_pub.key
2#其中test_pub.key为公钥文件,test.key即有公钥也有私钥

3、利用公钥加密文件

1openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en 

此处利用公钥加密了hello文件,并输出为hello.en ,-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。

4、利用私钥进行解密

1openssl rsautl -decrypt -in hello.en -inkey test.key -out hello

四、使用证书的方式加密文件或文件夹

证书加密方式同密钥方式类似 ,不过是又在密钥的基础上又新增了一层加密,更加增加了确解的难度,使逆方法或反向解密的几率为0 。具体做法如下:

1、通过dsa或rsa算法生成私钥

1#采用DSA算法
2$ openssl dsaparam -noout -out dsakey0.pem -genkey 1024
3#采用RSA算法
4$ openssl genrsa -out rsakey0.pem 1024

2、通过私钥文件生成证书

1#产生DSA算法的证书
2$ openssl req -x509 -key dsakey0.pem -days 365 -out mycert-dsa.pem -new
3#产生RSA算法的证书
4$ openssl req -x509 -key rsakey0.pem -days 365 -out mycert-rsa.pem -new

3、使用证书加密文件

1openssl smime   -encrypt -in test.txt -out etest.txt mycert-rsa.pem

4、使用私钥进行解密

1openssl smime  -decrypt -in etest.txt -inkey rsakey0.pem  -out dtest.txt

该方式一般在邮件系统上用的比较多。

参考页面:

turbolinux wiki页

openssl官方文档