`
qvb3d
  • 浏览: 171351 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

openssl 使用

 
阅读更多

OpenSSL 

OpenSSL 包含一个命令行工具用来完成 OpenSSL 库中的所有功能,更好的是,它可能已经安装到你的系统中了。

OpenSSL 是一个强大的安全套接字层密码库,Apache 使用它加密 HTTPS,OpenSSH 使用它加密 SSH,但是,你不应该只将其作

为一个库来使用,它还是一个多用途的、跨平台的密码工具。

这里简单说一下 OpenSSL 的背景,在 OpenSSL 之前,叫做 ssleay,它是一个由 EricA.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 格式总是要鉴定使用的算法, 并总是输出一

个小写的无空白的十六进制的字符串,你会发现这种格式更容易使用。    

这里有一些例子:

#: opensslsha1 filename 

SHA1(filename)= e83a42b9bc8431a6645099be50b6341a35d3dceb 

#: opensslmd5filename 

MD5(filename)= 26e9855f8ad6a5906fea121283c729c4 

在我早前的文章“GnuPG Hacks”中,

上面的例子使用了一个包括字符串“TheLinux Journal”的文件,注意这个字符串没有句号。 

如果你复杂这些结果时遇到了问题,这里提供一个带 ASCII 注释的十六进制的表示,注意新行末尾是 vi 自动加上去

的:      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

aes-128-cbc encryption password: 

Verifying aes-128-cbc encryption password: 

与 GnuPG 一样,OpenSSL 要求提供 2 次密语,并且不会回显到屏幕上。

解密也比 GnuPG 更复杂一点:

#: openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename

aes-128-cbc decryption password: 

注意例子中的-d 参数,它意味着解密。

OpenSSL 与 GnuPG 不一样,不能自动检查文件的类型或者使用了什么算法也不知道、也不清楚加密文件使用的密钥的长度

和模式。

你需要自己保存一个跟踪记录,

在我的例子中,我将这些信息放在文件扩展名里了,OpenSSL 不能为你管理文件和文件扩展名,你不得不指出输出数据写入

的位置。

如果你没有指定正确的算法,OpenSSL 可能输出一堆圾信息也可能产生一个看不懂的数字,无论怎样,没有正确的给

出选项,你的数据就不能正确地解密。     密语     在我们更进一步之前,我们应该先讨论一下密语的重要性,在大多

数加密系统中,密语是保存了其他机密的秘密,它通常是最薄弱的点,因此,创建一个强壮的密语是很重要的,但是这也很

困难,除非你有好用的工具,使用 OpenSSL 你就能快速地创建一个强壮的密语。

一个对密语简单的指导就是长度与优势的比较表,8 个字符不够长(表 1) ,目标是创建一个保密性强的而且你又能记

住的其他人又不知道的密语,不能靠猜或最后偶尔发现。 表 1 密码和密语被的估计时间强度比较,注意:时间是比较粗糙

的。

产生一个密语      OpenSSL 能创建非常强壮的随机密语:

#: openssl rand 15-base64wGcwstkb8Er0g6w1+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 中的进行比较,如果匹配你提供的就是正确的密码,你就能登陆,如果不匹配,你也不清楚密码是

好多了,因为存储的是打乱后的数据,计算器也不会知道你的密码是好多,反正你是不能登陆进去的。

这就是为什么打乱你自己的密码有用了,假设你在另一个计算器上需要一个新密码,或许它是一个新账号或你忘记了旧

的密码让管理员给你重设密码,如果你能亲自告诉管理员,那么没有问题,但是如果管理员不在怎么办呢?

或许你从来都没有和管理员见过面,你怎么传输你的新密码?电子邮件是不安全的,电话可能要好一点,邮寄一封信可能要

好几天(可能会有其他安全问题) ,传真机,文本消息和大多数纸张上的东西是不安全的。     更糟糕的是,你可能不信

任那个管理员,当然,管理员通常就是 root,但是其他人可能知道你的密码,或许你象在其他机器上使用相同的密码,并且

你也不信任那些机器的管理员。

因此,使用下面的方法: 

#: opensslpasswd -1

Password:

Verifying - Password:

$1$zmUy5lry$aG45DkcaJwM/GNlpBLTDy0 

输入 2 次密码,它不会回显的,如果你有多个账户,就运行多次上面的命令,输出的内容就是密码加密后的结果,由于

采用的是随机加密,每次运行结果都是不一样的,即使密码是相同的。 

在我的例子中,密码打乱后是这样的: $1$zmUy5lry$aG45DkcaJwM/GNlpBLTDy0 你的密码打乱后可能与这里完全不同,除

了开头的$1$。

打乱后的密码【译者注:实际上通常我们叫做 hash 值】就能用于电子邮件、传真、文本消息甚至通过电话交谈传输给

管理员了, 管理员据此可以重新设置你的密码 hash 值。      在管理员收到你的密码 hash 值后, 它可以手动修改/etc/shadow

或使用 chpasswd 命令,后面需要一个临时的新文件,叫做 newpassword,你的登陆 Id 和密码 hash 值象这

样:      LoginidHere:$1$ywrU2ttf$yjm9OXTIBnoKJLQK2Fw5c/ 这个文件可以包括多行,为其他帐户提供类似的功能。

然后,管理员作为 root 登陆运行:

chpasswd --encrypted < newpassword 

现在,新密码已经设置好了,一旦你登陆后立即修改你的密码是个好主意,除非你使用的是一个强壮的密语,这是因为密

码 hash 值,一旦暴露,就成为脱机强制的对象,除非这个密码是真的很长。

这个设置密码的方法是相当安全的,例如:使用这个技术,某个人能获取到密码 hash 值,创建一个账号,并知道登陆 id

和主机名,但是只有原先创建这个用户的人才知道密码,即使这个账号的密码 hash 值发布在杂志上也不用担心。

顺便说一下,那个 hash 值对应的密码是完全随机的基于 64 位字符编码的 28 位长,因此要它是非常困难的,

但是请注意,

不要用那些密码已经公布出来的 hash 值创建账号,

如:HXzNnCTo8k44k8v7iz4ZkR/QWkM2 

密码和 hash 值象下面这样创建:

#: openssl rand21 -base64

HXzNnCTo8k44k8v7iz4ZkR/QWkM2 

#: openssl passwd-1 

HXzNnCTo8k44k8v7iz4ZkR/QWkM2    

这些例子使用 MD5 密码 hash 值,目前通用的 linux 系统都是这样,如果你需要使用旧的 UNIX 系统 hash 值,只需要去掉-1

参数,

例如: #: openssl passwd 

Password:

Verifying - Password: 

xcx7DofWC0LpQ 

最后这个密码 hash 值的密码是:TheLinux 

密码基准检验    

OpenSSL 支持的许多算法使得它非常合适于密码基准检验,这对于比较相同硬件情况下不同算法的性能很有用,并且,它内

置了一个基准检验命令。

openssl  speed 命令,默认情况下,在每个单独支持的模式和选项下运行每个单独的算法,使用不同的数据大小,不同的

大小是重要的因为算法启动过头了。

完整运行 speed 需要花费大约 6 分钟时间,不考虑硬件的性能,产生 29 行摘要 124 行性能数据。

但是,注意加密算法的性能严重依赖特定的工具,对于高性能,

OpenSSL 在 x86 系统代码中有几个算法。其他结构如 ia64, SPARC 和 x86-64, 没有什么系统代码, 没有列出的架构更没有

了,系统代码放在 OpenSSL 源代码目录:crypto/*/asm,

这仅仅是 OpenSSL 命令行功能的一个样本。在 OpenSSL 网站上有更多的文档, 也有几个邮件列表提供技术支持。     

windows 的工具可以到

 

下载

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics