引言

  互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求)、数据完整性(没有被人修改过)、数据私密性(密文,无法直接读取)等。虽然现在已经有SSL/TLS协议实现的HTTPS协议,但是因在客户端上依赖浏览器的正确实现,而且效率又很低,所以一般的敏感数据(如交易支付信息等)还是需要我们使用加密方法来手动加密。


加密基础

学习如何使用加密之前,我们需要了解一些加密相关的基础知识。

加密算法一般分为两种:对称加密算法和非对称加密算法。

对称加密

对称加密算法是消息发送者和接收者使用同一个密匙,发送者使用密匙加密了文件,接收者使用同样的密匙解密,获取信息。常见的对称加密算法有:DES/3DES/AES.

对称加密算法的特点有:速度快,加密前后文件大小变化不大,但是密匙的保管是个大问题,因为消息发送方和接收方任意一方的密匙丢失,都会导致信息传输变得不安全。

非对称加密

与对称加密相对的是非对称加密,非对称加密的核心思想是使用一对相对的密匙,分为公匙和私匙,私匙自己安全保存,而将公匙公开。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。发送数据前只需要使用接收方的公匙加密就行了。常见的非对称加密算法有RSA/DSA:

非对称加密虽然没有密匙保存问题,但其计算量大,加密速度很慢,有时候我们还需要对大块数据进行分块加密。

数字签名

为了保证数据的完整性,还需要通过散列函数计算得到一个散列值,这个散列值被称为数字签名。其特点有:

  • 无论原始数据是多大,结果的长度相同的;
  • 输入一样,输出也相同;
  • 对输入的微小改变,会使结果产生很大的变化;
  • 加密过程不可逆,无法通过散列值得到原来的数据;

常见的数字签名算法有md5,hash1等算法。


PHP的openssl扩展

首先安装 openssl,开启php的 php_openssl 扩展;openssl扩展使用openssl加密扩展包,封装了多个用于加密解密相关的PHP函数,极大地方便了对数据的加密解密。

对称加密相关

string openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string&$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] )

以指定的方式和 key 加密数据,返回原始或 base64 编码后的字符串或者在失败时返回 FALSE

data     待加密的明文信息数据

method    加密算法方式。openssl_get_cipher_methods() 可获取有效密码方式列表。

options          是以下标记的按位或: OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING

iv      非 NULL 的初始化向量,在使用aes加密时,密钥长度128:iv 16bit;192:iv 24bit;256:iv 32bit

tag      使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签。

aad       附加的验证数据。

tag_length  验证 tag 的长度。GCM 模式时,它的范围是 4 到 16。

string openssl_decrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string $tag = "" [, string $aad = "" ]]]] )

实例:

 $encryptString = '那数十位天关境后期的骄子,皆是暴喝出声,下一瞬间';
echo '<pre>';
$ss = openssl_encrypt($encryptString, 'AES-128-CBC', '',,'');
#3d/Gei0wiCwSjj3pmS5DF0ZHOesVqLglnAcr3l8+Hjy84/iEyGOIYaTBOgwnth+BsjtOvv1F//dtfRJL71tsv2sxu1OiPSgTTS3/o1mxXCI= echo $ss,PHP_EOL; echo (openssl_decrypt($ss, 'AES-128-CBC', '',,''));
#那数十位天关境后期的骄子,皆是暴喝出声,下一瞬间

非对称加密相关

生成 RSA 密钥对

命令:

openssl  genrsa [-out filename] [-passout arg] [-f4] [-] [-rand file(s)] [-engine id] [-des|-des3|-idea] [numbits]

实例:

#简化方式
#生成私钥
openssl genrsa -out rsa_private_key.pem #将原始私钥转换为pkcs8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem #根据私钥生成公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #----------------------------------------------------------------------------------
#生成1024位rsa私钥,使用3des算法加密它(不加密使用明文保存密钥),口令为trousers
#输出到文件 rsaprivatekey.pem
openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 #使用私钥生成公钥,生成的公钥输出到rsapublickey.pem
openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapublickey.prm

实例:简单的加密解密类

 <?php

 class RsaCrypt {

     const PRIVATE_KEY_FILE_PATH = 'C:/Users/lenovo/rsa_private_key.pem';
const PUBLIC_KEY_FILE_PATH = 'C:/Users/lenovo/ras_public_key.pem'; public static function encode($orignData)
{
//密钥文件的路径
$privateKeyFilePath = self::PRIVATE_KEY_FILE_PATH;
extension_loaded('openssl') or die('php需要openssl扩展支持');
(file_exists($privateKeyFilePath)) or die('密钥的文件路径不正确');
//生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath)); ($privateKey) or die('密钥不可用');
//加密以后的数据,用于在网路上传输
$encryptData = '';
///////////////////////////////用私钥加密////////////////////////
if (openssl_private_encrypt($orignData, $encryptData, $privateKey)) {
return base64_encode($encryptData);
} else {
die('加密失败');
}
} public static function decode($encryptData)
{
//公钥文件的路径
$publicKeyFilePath = self::PUBLIC_KEY_FILE_PATH;
extension_loaded('openssl') or die('php需要openssl扩展支持');
(file_exists($publicKeyFilePath)) or die('公钥的文件路径不正确');
//生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
($publicKey) or die('公钥不可用');
//解密以后的数据
$decryptData = '';
///////////////////////////////用公钥解密////////////////////////
if (openssl_public_decrypt(base64_decode($encryptData), $decryptData, $publicKey)) {
return $decryptData;
} else {
die('解密失败');
}
}
} $rsa = new RsaCrypt(); $en = $rsa->encode('你好');
$de = $rsa->decode($en); echo $en;
echo $de;

OpenSSL 命令总览

version    用于查看版本信息

enc          用于加解密

ciphers    列出加密套件

genrsa    用于生成私钥

rsa          RSA密钥管理(例如:从私钥中提取公钥)

req          生成证书签名请求(CSR)

crl           证书吊销列表(CRL)管理

ca           CA管理(例如对证书进行签名)

dgst        生成信息摘要

rsautl       用于完成RSA签名、验证、加密和解密功能

passwd    生成散列密码

rand        生成伪随机数

speed      用于测试加解密速度

s_client    通用的SSL/TLS客户端测试工具

X509         X.509证书管理

verify        X.509证书验证

pkcs7        PKCS#7协议数据管理

pkcs8        PKCS#8协议数据管理

pkcs12       PKCS#12协议数据管理

详细参考 http://blog.csdn.net/as3luyuan123/article/list/3

OpenSSL使用小结的更多相关文章

  1. PHP的openssl加密扩展使用小结

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  2. OpenSSL Heartbleed原因小结

    User发送心跳报文给Server,Server复制心跳报文的内容回应User. memcpy(bp, p1, payload); Server拷贝心跳报文的内容给Client时,如果拷贝的字节数目超 ...

  3. openssl 证书请求和自签名命令req详解

    1.密钥.证书请求.证书概要说明 在证书申请签发过程中,客户端涉及到密钥.证书请求.证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水.我们以申请证书的流程说 ...

  4. openssl 非对称加密算法DSA命令详解

    1.DSA算法概述 DSA算法是美国的国家标准数字签名算法,它只能用户数字签名,而不能用户数据加密和密钥交换. DSA与RSA的生成方式不同,RSA是使用openssl提供的指令一次性的生成密钥(包括 ...

  5. openssl 非对称加密算法RSA命令详解

    1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...

  6. CURL使用HTTPS的技术小结

    摘自http://www.51testing.com/html/14/175414-248202.html CURL使用HTTPS的技术小结 cURL是linux下命令行提交HTTP(S)请求的一个很 ...

  7. SSL证书与Https应用部署小结

    为了提高网站的安全性,一般会在比较敏感的部分页面采用https传输,比如注册.登录.控制台等.像Gmail.网银等全部采用https传输. https/ssl 主要起到两个作用:网站认证.内容加密传输 ...

  8. https学习笔记三----OpenSSL生成root CA及签发证书

    在https学习笔记二,已经弄清了数字证书的概念,组成和在https连接过程中,客户端是如何验证服务器端的证书的.这一章,主要介绍下如何使用openssl库来创建key file,以及生成root C ...

  9. 在Linux环境下使用OpenSSL对消息和文件进行加密(转载)

    转自:http://netsecurity.51cto.com/art/201301/378513.htm 1.简介 OpenSSL是一款功能强大的加密工具包.我们当中许多人已经在使用OpenSSL, ...

随机推荐

  1. 整理ing

    RT 要学习的 专克bzoj权限题 钟神p系列

  2. Android WebView使用与JavaScript使用

    WebView基本使用 WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?x ...

  3. springboot之RocketMq实现

    环境:win10 1.下载安装包 http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-re ...

  4. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_1 请求参数绑定入门

    请求参数的绑定 参数绑定 创建新的页面 给方法加上注解 前面没有斜线 重新部署项目 传递一个username的值 后台方法接收 重新部署项目 再传一个password的值 再输出password ja ...

  5. java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)

    1.延时加载和抓取: hibernate.cfg.xml: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-co ...

  6. eventfd(2) 结合 select(2) 分析

    本文代码选自内核 4.17 eventfd(2) - 创建一个文件描述符用于事件通知. 使用 源码分析 参考 #include <sys/eventfd.h> int eventfd(un ...

  7. normalization(统计)

    In statistics and applications of statistics, normalization can have a range of meanings.[1] In the ...

  8. 不错的点击li标签删除的例子

    <script type="text/javascript">function delElement(obj){ obj.parentNode.removeChild( ...

  9. cocos2dx基础篇(26) 单例模式

    单例模式,说的通俗一点就是:创建某个类的全局唯一静态实例对象.也就是说从它创建开始,一直到整个游戏程序结束才会释放资源,期间一直保存的着数据. 单例类在大部分游戏中应该是必不可少的部分,如整个游戏音乐 ...

  10. 微服务简历V1.0

    张三 电话:xxx-xxxx-xxxx      邮箱: xxxxxxx@qq.com 年龄:x岁        籍贯:江苏 求职意向:java开发工程师   期望薪资:面议 专业技能 熟练使用Ecl ...