引言

  互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求)、数据完整性(没有被人修改过)、数据私密性(密文,无法直接读取)等。虽然现在已经有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. 2018-2019-2 网络对抗技术 20165232 Exp 8 Web基础

    2018-2019-2 网络对抗技术 20165232 Exp 8 Web基础 原理与实践说明 1.实践内容概述 Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与 ...

  2. 十四周学习总结&简易记事本

    学习总结: 一.JDBC: 1.JDBC提供里一套与平台无关的标准数据库操作接口和类,只要支持java的数据库厂商,所提供的数据库都可以以使用JDBC操作. 2.JDBC的主要操作类及接口: 3.JD ...

  3. 排序算法总结(java实现)

    排序算法 介绍:排序分为内部排序和外部排序,内部排序指在内存中进行的排序过程:外部排序指在外存中进行排序的过程,但是此过程建立在多次访问内存的基础上(分成一段段利用内部排序进行排序). 以下排序均属于 ...

  4. 有关sublime的一些使用

    习惯了vs的快捷键,用sublime的时候始终感觉不太跟手. 点击 “首选项”→“按键绑定-默认” 在新的界面中就可以更改你想要的快捷键了. 1.自动格式化对齐: 查找 "command&q ...

  5. leetcode 75颜色分类

    两趟扫描,由于排序变量的特殊性,使用计数排序方法可以明显降低至O(n)time O(n) space 关于计数排序:https://mp.weixin.qq.com/s/WGqndkwLlzyVOHO ...

  6. electron-Menu创建原生应用菜单和上下文菜单。

    当在MacOS.Windows.Linux中使用menu设置程序菜单时,会设置在各个程序窗体的顶层. Note: 如果没有在app中设置一个菜单,系统会自动生成一个默认菜单, 默认生成的菜单中包含了一 ...

  7. IFB

    本文翻译自Linux官方IFB文档 IFB(中介功能块设备)是IMQ(中介队列设备)的继任者,IMQ从来没有被集成过,IFB拥有IMQ的优点,在SMP上更加清晰明了,并且代码量缩减了非常多,旧的中介设 ...

  8. Rate 评分

    评分组件 基础用法 评分被分为三个等级,可以利用颜色对分数及情感倾向进行分级(默认情况下不区分颜色).三个等级所对应的颜色用过colors属性设置,而它们对应的两个阈值则通过 low-threshol ...

  9. WPF VLC客户端和SDK的简单应用

    VLC_SDK编程指南 VLC 是一款自由.开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD.音频 CD.VCD 及各类流媒体协议.它可以支持目前市面上大多数的视频解码,除了Rea ...

  10. 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_02.SpringMVC框架的介绍

    Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter Spring MVC 是基于方法设计的,而Struts2是基于类,Struts2每次执行都会创建一个动作类.所以 ...