功能作用:SSL(Secure Socket Layer)是netscape公司提出的主要用于web的安全通信标准,分为2.0版和3.0版。TLS(Transport Layer Security)是IETF的TLS 工作组在SSL3.0基础之上提出的安全通信标准,目前版本是1.0,即RFC2246。SSL/TLS提供的安全机制可以保证应用层数据在互联网络传输不被监听、伪造和窜改。
内部包含什么:它是一个健全的、商业级的、全开放的和开放源代码的工具包,实现安全套接层协议(SSL v2/v3)和传输层安全协议(TLS v1)以及形成一个功效完整的通用目的的加密技术库。openssl 是sslv2、sslv3、tlsv1的一份完整实现,内部包含了大量加密算法程序.其应用程序提供了丰富的加密、验证、证书生成等功能,甚至可以用它建立一个完整的CA。同时,它也提供了一套完整的库函数,可用开发用SSL/TLS的通信程序序。Apache的https两种版本 mod_ssl和apachessl均基于它实现的。
缺点:openssl 的缺点是文档太少,连一份完整的函数说明都没有,man page也至今没做完整,如果想用它编程序,除了熟悉已有的文档(包括 ssleay,mod_ssl,apachessl的文档)外,可以到它的maillist上找相关的帖子,许多问题可以在以前的文章中找到答案。
优点:OpenSSL 采用 C 语言作为开发语言,这使得 OpenSSL 具有优秀的跨平台性能。OpenSSL 支持 Linux、Windows、BSD、Mac、VMS 等平台,这使得 OpenSSL 具有广泛的适用性。Openssl是开源的,对于程序员来说,openssl所有的技术实现细节都是可见的。 Openssl的核心加密库ssleay涉及范围广,功能齐全,逻辑合理。打破了美国不允许强加密产品出口的限制 。
历史版本:
1.openssl+perl+VS2010install
ActivePerl window安装程序下载:http://www.activestate.com/activeperl/downloads/
然后当然要下载OpenSSL的源码了: http://www.openssl.org/source/
下载ActivePerl 5.16.3 for windows(x86)后安装 ,和解压OpenSSL源代码压缩包文件openssl-1.0.1e.tar.gz[LATEST]。安装完成后,使用管理员权限打开VS2010的命令提示窗口,然后进入OpenSSL的目录,按照以下步骤就可以进行编译了:
cd openssl
perl configure VC-WIN32
ms\do_ms
完成上面步骤后可以看到两个关键脚本文件:nt.makntdll.mak.如果我们需要编译后的OpenSSL库是支持动态DLL形式的,那么应该使用ntddll.mak文件进行编译,这样编译完成我们会得到四个与OpenSSL的API库有关文件:ssleay32.lib,libeay32.lib,ssleay32.dll和libeay32.dll.执行的编译命令形式如下:nmake-f ms\ntdll.mak
如果不希望以动态库的形式使用OpenSSL,那么可以使用nt.mak文件进行编译.这样编译后使用OpenSSL的时候直接将代码链接进我们的程序里面.执行命令如下:nmake -f ms\nt.mak
nmake -f ms\ntdll.mak //编译动态库
nmake -f ms\ntdll.mak test //测试动态库
编译完成后会在\out32dll 目录下生成库文件()和动态链接库文件(libeay32、ssleay32的Lib以及Dll文件)、Openssl可执行文件openssl.exe和测试程序。
2.用Openssl进行文件的对称加密操作
(1)Openssl支持的加密算法有:
-aes-128-cbc-aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ecb -aes-128-ofb
-aes-192-cbc -aes-192-cfb -aes-192-cfb1
-aes-192-cfb8 -aes-192-ecb -aes-192-ofb
-aes-256-cbc -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ecb -aes-256-ofb
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-ofb -des-ofb
-des3 -desx -desx-cbc
-rc2 -rc2-40-cbc -rc2-64-cbc
-rc2-cbc -rc2-cfb -rc2-ecb
-rc2-ofb -rc4 -rc4-40
(2)Openssl加密指令语法:
SYNOPSIS
openssl enc -ciphername [-in filename][-out filename] [-pass arg] [-e]
[-d] [-a] [-A] [-k password] [-kfile filename][-K key] [-iv IV] [-p]
[-P] [-bufsize number] [-nopad] [-debug]
说明:
-chipername选项:加密算法,Openssl支持的算法在上面已经列出了,你只需选择其中一种算法即可实现文件加密功能。
-in选项:输入文件,对于加密来说,输入的应该是明文文件;对于解密来说,输入的应该是加密的文件。该选项后面直接跟文件名。
-out选项:输出文件,对于加密来说,输出的应该是加密后的文件名;对于解密来说,输出的应该是明文文件名。
-pass选项:选择输入口令的方式,输入源可以是标准输入设备,命令行输入,文件、变量等。
-e选项:实现加密功能(不使用-d选项的话默认是加密选项)。
-d选项:实现解密功能。
-a和-A选项:对文件进行BASE64编解码操作。
-K选项:手动输入加密密钥(不使用该选项,Openssl会使用口令自动提取加密密钥)。
-IV选项:输入初始变量(不使用该选项,Openssl会使用口令自动提取初始变量)。
-salt选项:是否使用盐值,默认是使用的。
-p选项:打印出加密算法使用的加密密钥。
(3)案例:
1. 使用aes-128-cbc算法加密文件:
openssl enc -aes-128-cbc -in install.log-out enc.log
(注:这里install.log是你想要加密的文件,enc.log是加密后的文件,回车后系统会提示你输入口令)
2. 解密刚刚加密的文件:
openssl enc -d -aes-128-cbc-in enc.log -out install.log
(注:enc.log是刚刚加密的文件,install.log是解密后的文件,-d选项实现解密功能)
3.加密文件后使用BASE64格式进行编码:
openssl enc -aes-128-cbc -in install.log-out enc.log -a
4.使用多种口令输入方式加密:
openssl enc -des-ede3-cbc -in install.log-out enc.log -pass pass:111111
(这种方式的好处是你可以把它写入到脚本中,自动完成加密功能,不使用pass选项默认系统会提示输入口令,并且确认,是需要人工操作的)
例子:
命令执行结果:
3. 实例
在VS2010项目中引用OpensslLib静态库实现SHA256散列算法:
项目属性-VC++目录--包含目录:
如:D:\openssl-1.0.1e\include 或者D:\openssl-1.0.1e\inc32
项目属性-VC++目录—库目录
如:D:\openssl-1.0.1e\out32dll
源代码:
#include <openssl/sha.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//添加静态链接库
#pragma comment(lib, "libeay32.lib")//密码算法库
//#pragma comment(lib, "ssleay32.lib")//SSL协议动态库
void sha256_str(char* str, char outputBuffer[65])
{
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str, strlen(str));
SHA256_Final(hash, &sha256);
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
}
}
int main()
{
char *in_str="abc";
char outbuffer[65];//64*8=512
system("title SHA256");
sha256_str(in_str, outbuffer);
printf("outbuffer=%s\n",outbuffer);
printf("strlen(outbuffer)=%d\n",strlen(outbuffer));
return 0;
}
运行结果:
SHA256哈希 - 在线SHA256哈希发生器运行结果:
http://www.convertstring.com/zh_CN/Hash/SHA256