1 概述
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
OpenSSL是实现安全套接字层(SSL v2 / v3)和传输层安全(TLS v1)网络协议及其所需的相关加密标准的加密工具包。
OpenSSL:开源项目
三个组件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss
.openssl命令:
两种运行模式:交互模式和批处理模式
opensslversion:程序版本号
标准命令、消息摘要命令、加密命令
标准命令:enc, ca, req, ...
查看帮助:openssl ?
可以通过openssl 来创建CA和颁发证书,文章http://ghbsunny.blog.51cto.com/7759574/1964754
有做介绍,本文仅介绍openssl这个工具包的其他常用功能
2 案例介绍
2.1 对称加密
工具:openssl enc, gpg,文章 http://ghbsunny.blog.51cto.com/7759574/1964887 已经介绍
算法:3des, aes, blowfish, twofish
.enc命令:
对称密码命令允许使用基于密码或明确提供的密钥的各种块和流密码来加密或解密数据。 Base64编码或解码也可以通过本身或加密或解密来执行。
The symmetric cipher commands allow data to be encrypted or decrypted using various block and stream ciphers using keys based on passwords or explicitly provided. Base64 encoding or decoding can also be performed either by itself or in addition to the encryption or decryption.
帮助:man enc
例子
加密文件
以下命令运行需要输入一个密码,当解密的时候需要输入相同的密码才能解密,这里新生成的文件后缀名不一定是cipher,可以自己指定
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
解密文件
openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
2.2 公钥加密
公钥加密生成非对称的密钥
算法:RSA, ELGamal
工具:gpg, openssl rsautl(man rsautl)
数字签名:
算法:RSA, DSA, ELGamal
密钥交换:
算法:dh
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。命名是取其名字首字母组合成RSA
RSA公钥与私钥主要用于数字签名(Digital Signature)与认证(Authentication),我们一般也称之为不对称加密/解密。
2.2.1 生成密钥对
帮助:man genrsa
.生成私钥,这个生成密钥的过程要掌握
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
私钥文件生成后,建议把权限改成600,保护,放在被其他人查看密码信息
私钥里的文件,如果被拿到,没有通过des这关键字加密的话,就相当于是明文
这个命令执行的时候,要输入八位数的密码,当要使用这个私钥的时候需要输入密码
(umask 077; openssl genrsa –out test.key –des 2048)
括号表示子进程,结束后,umask就会恢复未默认的值,umask的值使得其他人和组都没有任何权限,是为了保护生成的私钥
2.2.2 从私钥中提取出公钥,导出公钥
公钥推不出私钥,私钥可以推出公钥
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
Openssl rsa –in test.key –pubout –out test.key.pub
公钥是公开的,可以不设置权限,以上是生成公钥
2.2.3 公钥加密文件
openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file
-in 指定被加密的文件
-inkey 指定加密公钥文件
-pubin 表面是用纯公钥文件加密
-out 指定加密后的文件
例子:
openssl rsautl -encrypt -in ftpback -inkey test.key.pub -pubin -out ftpssl
2.2.4 私钥解密文件
openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file
-in 指定需要解密的文件
-inkey 指定私钥文件
-out 指定解密后的文件
例子:
openssl rsautl -decrypt -in ftpssl -inkey test.key -out ftpdec
2.3 单向加密
单向加密即获取摘要
工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst
dgst:摘要功能输出所提供文件的消息摘要或十六进制形式的文件。 它们也可用于数字签名和验证。
The digest functions output the message digest of a supplied file or files in hexadecimal form. They can also be used for digital signing and verification.
.dgst命令:
帮助:man dgst
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
openssl dgst -md5 testfile
以上命令将文件生成一个固定长度的摘要值,算法是md5,大小占128bite
md5sum /PATH/TO/SOMEFILE
以上这两个md5得到的结果是一样的
.MAC: Message Authentication Code,单向加密(hash)的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
MAC 消息认证码,构造方法可以基于hash,也可以基于对称加密算法,HMAC是基于hash的消息认证码。数据和密钥作为输入,摘要信息作为输出,常用于认证。
源文档
2.4 生成用户密码
passwd命令:
帮助:man sslpasswd
openssl passwd -1 -salt SALT
-1对应的就是hash的md5算法
SALT:这里是盐值,人为指定,使得同一密码生成的加密值不一样,最多8位,超过8位没有意义,比如前面8位一样,后面还有几位数不一样,这样生成的密码值是一样的
openssl passwd -1 –salt centos
grub-md5-crypt同样生成md5加密的口令,centos为盐值
比如这里的密码我都是输入123,但是盐值不一样,一个是centos,一个是centos6,生成的加密值不一样
2.5 生成随机数
帮助:man sslrand
rand命令在播放随机数生成器一次后输出num伪随机字节。 与其他openssl命令行工具一样,除了-rand选项中给出的文件外,PRNG种子使用文件$ HOME / .rnd或.rnd。 如果从这些来源获得足够的播种,将会写回新的$ HOME / .rnd或.rnd文件。
The rand command outputs num pseudo-random bytes after seeding the random number generator once. As in other openssl command line tools, PRNG seeding uses the file $HOME/.rnd or .rnd in addition to the files given in the -rand option. A new $HOME/.rnd or .rnd file will be written back if enough seeding was obtained from these sources.
openssl rand -base64|-hex NUM
指定数字生成随机数,如果是-hex 后面的数值比如6,那么生成的长度是12位,因为hex生成的随机数是16进制组合的数,hex 后面的num是字节数,一个16进制数占用4位,半个字节
base后面可以生成随机密码
base64 生成随机的数,可以用任何字符,也可以把图片保存成base64的格式,通过base64生成的图片,可以
用base64来还原出图片
NUM: 表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2
3 总结
openssl还有很多用法,本文仅单纯介绍了其中一部分,更多用法请使用帮助 man openssl 进行查看