您现在的位置是:首页 > 学无止境
永强教你加解密:对称篇(一)
转载自:https://segmentfault.com/a/1190000019455770
简单说来呢,加解密技术就是分为两大类:
对称加解密
非对称加解密
其中,常见的对称加解密算法有DES、3DES、AES;而非对称加解密技术比较典型的则是RSA,就是什么公钥私钥证书什么乱七八糟的。
我们先从对称加解密开始,粗暴地说呢,对称加解密就是“加密和解密的时候用同一个密码”,听起来就非常对称,有没有?
用图表达一下就是:
最一开始的时候,我朝人民一般都是倾向于使用“天王盖地虎”,“宝塔镇河妖”这种加解密技术;然而,美帝用了一种叫做DES的技术进行对称加解密,这玩意一度成为业界通用的对称加解密技术,银行、五角大楼都爱用这玩意,可惜好景不长、世风日下、世态炎凉,这玩意的破解成本越来越低越来越低~~ 于是,为了续命,就又有一些白胡子老头给DES打补丁,缝缝补补搞出来一个玩意叫做3DES,继续用,又不是不能用…这个顾名思义就行了,别打我,真的:3DES就是用DES处理(注意是处理,我没说是加密)了三次的意思。就目前看来,3DES实际上用的可能也并不是十分广泛了,所以如果大家在选择对称加解密技术的时候,尽量避开DES和3DES就可以了。
呵呵,喜新厌旧的沙雕人类…虽然DES已经没人用了,但毕竟也是辉煌过,我觉得还是得动手表演一波儿。我们知道,在php7里,原来的mcrypt系列加解密已经被放弃掉了,官方建议我们使用openssl系列来进行加解密,所以确保你的PHP环境里安装了openssl标准扩展。
<?php// 这个函数打印出来openssl支持的所有加密方法以及模式的组合$arr_ava_methods = openssl_get_cipher_methods(); print_r( $arr_ava_methods );
文件保存成test.php后,执行一把:php test.php | grep des,结果你们感受一下:
其中带有ede的,比如des-ede*这样的就表示是3DES。还有这么多奇奇怪怪的后缀是什么含义?回头再说…又不是不能用。
筛选一下,我们看des(非des3)有几种带着尾巴的具体方法:
des-cbc
des-cfb*(注意后面的通配符星号)
des-ecb
des-ofb
我们先用传统des方法继续进行装逼表演:
<?php// 我们就选用des-ecb方法进行一次des加密$ava_methods = openssl_get_cipher_methods(); $my_method = 'des-ecb';if ( !in_array( $my_method, $ava_methods ) ) { exit( '错误的加密方法'.PHP_EOL ); } $key = "123456"; $data = "helloMOTO";echo "明文:".$data.PHP_EOL; $enc_data = openssl_encrypt( $data, $my_method, $key );echo "密文:".$enc_data.PHP_EOL; $dec_data = openssl_decrypt( $enc_data, $my_method, $key );echo "明文:".$dec_data.PHP_EOL;
保存为test.php执行一把:
完美!就像老王的meshbox一样,完美!
简单解析一下:
换个方法继续一下:我们使用openssl_get_cipher_methods()函数获取到可以使用的所有des加密方法,然后简单判断一下我们选用的方法是否在其中;紧接着我们用123456作为密码,helloMOTO作为明文内容,openssl_encrypt()就是加密函数,openssl_decrypt()就是解密函数,具体的函数原型出门左拐查手册,总之一切都是这么的完美!
<?php// 我们就选用des-ecb方法进行一次des加密$ava_methods = openssl_get_cipher_methods(); $my_method = 'des-cbc';if ( !in_array( $my_method, $ava_methods ) ) { exit( '错误的加密方法'.PHP_EOL ); } $key = "123456"; $data = "helloMOTO";echo "明文:".$data.PHP_EOL; $enc_data = openssl_encrypt( $data, $my_method, $key );echo "密文:".$enc_data.PHP_EOL; $dec_data = openssl_decrypt( $enc_data, $my_method, $key );echo "明文:".$dec_data.PHP_EOL;
执行一波儿,结果如下图:
并不完美,报错了,一个warning级的错误,虽然并不影响加密和解密,但是毕竟是报错了,错误原文我复制粘贴过来,你们感受下:
PHP Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /home/ubuntu/lab/test.php on line 10
大概意思就是:用了一个并不推荐而且不安全的空iv在test.php的第十行。我正在翻译的这句的时候,已经精通英语的老李在旁边跟我说“你这翻译也太硬了,要学会人性化,看好了,一看你这就是没上过全日制大学本科的恶果”:
PHP警告:openssl_encrypt():iv向量最好别是空的,不推荐这么用,而且这样并不安全~
什么是iv向量?先抛开这个问题,我先写一段代码,让他能跑起来:
<?php$ava_methods = openssl_get_cipher_methods(); $my_method = 'des-cbc';if ( !in_array( $my_method, $ava_methods ) ) { exit( '错误的加密方法'.PHP_EOL ); }// 处理iv向量的两行代码$iv_length = openssl_cipher_iv_length( $my_method ); $iv = openssl_random_pseudo_bytes( $iv_length ); $key = "123456"; $data = "helloMOTO";echo "明文:".$data.PHP_EOL; $enc_data = openssl_encrypt( $data, $my_method, $key, 0, $iv );echo "密文:".$enc_data.PHP_EOL; $dec_data = openssl_decrypt( $enc_data, $my_method, $key, 0, $iv );echo "明文:".$dec_data.PHP_EOL;
注意到8、9、10和15、17两行,均为iv向量做了改动,然后这次代码保存了运行一波儿:
文章评论
- 登录后评论
点击排行
-
php-fpm安装、配置与优化
转载自:https://www.zybuluo.com/phper/note/89081 1、php中...
-
centos下postgresql的安装与配置
一、安装(以root身份进行)1、检出最新的postgresql的yum配置从ht...
-
Mysql的大小写敏感性
MYSQL在默认的情况下查询是不区分大小写的,例如:CREATE TABLE...
-
关于URL编码
转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding....
-
header中的Cache-control
网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的...