黑客眼中的OpenSSL:强大的密码工具

转自:http://tech.ddvip.com/2008-03/120667537443808.html

    OpenSSL包含一个命令行工具用来完成OpenSSL库中的所有功能,更好的是,它可能已经安装到你的系统中了。
    OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。
    这里简单说一下OpenSSL的背景,在OpenSSL之前,叫做ssleay,它是一个由Eric A.Young编写的SSL工具,它不断改进最终变成了OpenSSL,与NCSA的HTTPd变成Apache服务器的过程非常类似,今天,OpenSSL支持多种加密算法和协议。
    OpenSSL有许多的特征,而且还有SSL客户端和服务端特征,OpenSSL还有:

  • 美国联邦政府NIST FIPS 140-2一级评估确认
  • TLS,下一代SSL协议
  • X.509密钥和证书的生成
  • X.509证书权力
  • S/MIME加密
  • 文件加密和粉碎
  • 打乱UNIX密码
  • 9个不同的商业密码硬件设备
  • 密码性能测试
  • 36个命令
  • 6个消息摘要算法
  • 9个密码算法
  • 多个加密协议
    尽管OpenSSL很复杂,但是大量的复杂性可以被避免的,本文剩下的部分将集中在易于使用的特征上,在shell代码中仅仅需要几行就可以了。
    本文使用与我早期编写的GnuPG Hacks文章一致的小结标题,以便于比较OpenSSL和GnuPG。
    入门
    首先,确认一下OpenSSL已经安装并处于你的路径之下,许多Linux发行版,甚至一下小的发行版,都包括了OpenSSL,通常,OpenSSL处于/usr/bin/下。
    在所有的例子中,shell提示符都是$。
    第一步,输入:
    $ openssl version
    注意这里在version选项前是没有破折号的。
    你应该看到类似下面这样的输出:
OpenSSL 0.9.7d 17 Mar 2004
    准确的版本号,日期和其他可能不同的细节,写本文的时候,目前的版本是OpenSSL0.98a,我们正在使用的例子能工作在大部分OpenSSL版本下。如果你只输入了openssl,没有附加任何的参数,你将得到下面这样的提示符:
OpenSSL>
    如果是这样,只需要输入quit或按Ctrl-C即可安全地退出,它OpenSSL内部命令行提示符,它没有命令行编辑功能,也没有明确的帮助功能,但是,如果你输入一个它不认识的命令,它会列出一个可用的命令列表。
    二进制文件保护
    二进制文件典型地用于使用MIME的电子邮件,如果你的电子邮件软件不支持MIME,如大多数命令行电子邮件客户端,你将被uuencode困扰,你可以使用基于64位编码的OpenSSL,复杂的MIME协议也使用的是64位编码,但是它不能直接兼容MIME。
    要使用64位编码打包二进制文件成文本文件,输入:
$ openssl base64 < filename.bin > filename.txt
    要打开64位编码的文本文件,输入:
$ openssl base64 -d < filename.txt > filename.bin
    注意OpenSSL不会关心文件扩展名。
    OpenSSL与GnuPG或MIME不一样,它还能对短字符串进行编码,如下:
$ echo "The Linux Journal" | openssl base64
VGhlIExpbnV4IepvdXJuYWwK
    解码:
$ echo "VGhlIExpbnV4IEpvdXJuYWwK" | openssl base64 -d
    The Linux Journal
    注意-d选项,它意味着解码。
    更好的校验和
    sum和cksum是传统的UNIX校验程序,它们工作得很好,只要你不需要跨平台兼容或安全,你也不用担忧会出现2个完全不同的文件有相同的校验和值。
    尽管Linux系统经常安装了md5sum,MD5算法遭受了一个相对较新的漏洞,现在不应该使用它。如果它已经安装了,应该使用更安全的sha1sum,但是,一些版本只能同时对一个文件进行打乱,一些不能处理标准输入或者有其他的不足,如果你运行这些程序遇到了问题或者你想有一致的、比较知名的、具有良好跨平台的软件,建议考虑OpenSSL。
OpenSSL打乱输出格式与GnuPG有一点不同,但是数字是相同的,OpenSSL格式总是要鉴定使用的算法,并总是输出一个小写的无空白的十六进制的字符串,你会发现这种格式更容易    使用。
   这里有一些例子:
$ openssl sha1 filename
SHA1(filename)= e83a42b9bc8431a6645099be50b6341a35d3dceb

    在我早前的文章“GnuPG Hacks”中,上面的例子使用了一个包括字符串“The Linux Journal”的文件,注意这个字符串没有句号。
    如果你复杂这些结果时遇到了问题,这里提供一个带ASCII注释的十六进制的表示,注意新行末尾是vi自动加上去的(图1)

 
    OpenSSL与GnuPG不一样,它没有SHA-512加密算法,但是OpenSSL有MD2,MD4,MDC2,这些都是旧的算法了,只是为了保持向后兼容,和MD5一样,现在它们都不应该拿来使用。
    

    快速整洁的加密

    尽管这不是OpenSSL的强项,但它也能加密文件,灵活的OpenSSL做这件事要比GnuPG复杂一些。
    OpenSSL默认选项比较少,因此要使用更多的选项,也有许多算法可供选择,一些算法如DES和RC4-40,只是为了向后兼容,现在不应该再拿来使用了,你应该使用强壮的算法如bf(它是Blowfilsh算法的简称)和-aes-128-cbc(它是美国NIST高级加密标准—AES,运行在CBS模式下使用128位密钥)。
    这里有一个例子:
$ openssl enc -aes-128-cbc < filename > filename.aes-128-cbc
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:
    与GnuPG一样,OpenSSL要求提供2次密语,并且不会回显到屏幕上。
    解密也比GnuPG更复杂一点:
$ openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename
enter aes-128-cbc decryption password:
    注意例子中的-d参数,它意味着解密。
    OpenSSL与GnuPG不一样,不能自动检查文件的类型或者使用了什么算法也不知道、也不清楚加密文件使用的密钥的长度和模式。你需要自己保存一个跟踪记录,在我的例子中,我将这些信息放在文件扩展名里了,OpenSSL不能为你管理文件和文件扩展名,你不得不指出输出数据写入的位置。
    如果你没有指定正确的算法,OpenSSL可能输出一堆垃圾信息也可能产生一个看不懂的数字,无论怎样,没有正确的给出选项,你的数据就不能正确地解密。

    密语


    在我们更进一步之前,我们应该先讨论一下密语的重要性,在大多数加密系统中,密语是保存了其他机密的秘密,它通常是最薄弱的点,因此,创建一个强壮的密语是很重要的,但是这也很困难,除非你有好用的工具,使用OpenSSL你就能快速地创建一个强壮的密语。
    一个对密语简单的指导就是长度与优势的比较表,8个字符不够长(表1),目标是创建一个保密性强的而且你又能记住的其他人又不知道的密语,不能靠猜或最后偶尔发现。
表1 密码和密语被破解的估计时间强度比较,注意:破解时间是比较粗糙的。

TypeBytesCharactersBits/CharactersTotal BitsTime to crack
Base64[A-Za-z0-9+/=]68648Minutes to Hours
Base64[A-Za-z0-9+/=]912672Years
Base64[A-Za-z0-9+/=]1216696Decades
Base64[A-Za-z0-9+/=]15206120Uncrackable?
Diceware Passphase8 words12.9 per word120Uncrackable?

 

 

 

 

 

 



    产生一个密语
    OpenSSL能创建非常强壮的随机密语:
$ openssl rand 15 -base64
wGcwstkb8Er0g6w1+Dm+
    如果你运行了这个例子,你的输出将与这里的输出不同,因为密语是随机产生的。
    第一个参数15是产生的二进制字节数,第二个参数-base64指出那些二进制字节应该用基于64位字符编码,对于15字节而言,输出总是20个字符,加上一个新行字符。
    基于64位字符设定了只由大写和小写的字母A-Z,数字1-9和3个标点字符:加号、斜线号和等号。这是一个有意的字符限制设置,更复杂的字符设置不是必需的,仅仅增加一个额外的字符使得安全变得不同,例如:一个8位字符完全可打印的ASCII密码大约与一个9位字符基于64位字符编码的密码强度相当。
    尽管可以使用openssl rand快速生成密语,但是专业的密语生成器生成强壮的并容易记忆的密语,我强烈推荐使用它。   

     加密密码
    还有一些事情是GnuPg不能做的,OpenSSL内置了一个命令用来创建加密的linux密码,就象/bin/passwd一样。
    跳过这个段落避免陷入钻牛角尖的密码术,尽管通常叫做加密,linux密码实际上使用的是MD5或旧的UNIX密码打乱机制(基于DES加密算法),这就允许linux不知道你的密码,即使你提供了正确的密码让它知道了。当你设置你的密码时,linux打乱你的密码并保存在/etc/shadow中,当你登陆时,linux提取你输入的密码并再打乱一次,再与保存在/etc/shadow中的进行比较,如果匹配你提供的就是正确的密码,你就能登陆,如果不匹配,你也不清楚密码是好多了,因为存储的是打乱后的数据,计算机也不会知道你的密码是好多,反正你是不能登陆进去的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值