单向加密 对称加密 非对称加密
单向加密:
单向加密又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密处理成密文,密文无法解密。一般适合于验证,在验证过程中,重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新认证。广泛使用于口令加密。
一:base64
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
主要就是BASE64Encoder、BASE64Decoder两个类
BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充
二:md5
message-digest algorithm 5
三:Crypt加密:
1.crypt()接受两个参数,第一个为需要加密的字符串,第二个为盐值(就是加密干扰值,如果没有提供,则默认由PHP自动生成);返回散列后的字符串或一个少于 13 字符的字符串,后者为了区别盐值。
2.crypt()为单向加密,跟md5一样。
四:Sha1加密:
string sha1 ( string str[,boolraw_output = false ]
1.跟md5很像,不同的是sha1()默认情况下返回40个字符的散列值,传入参数性质一样,第一个为加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,sha1()则会返回原始的20 位原始格式报文摘要
2.sha1()也是单行加密,没有逆向解密算法
string urlencode ( string $str )
1.一个参数,传入要加密的字符串(通常应用于对URL的加密),
2.urlencode为双向加密,可以用urldecode来加密(严格意义上来说,不算真正的加密)
3.返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
非对称加密:
先说非对称加密 . 直接理解为 2把钥匙. 分别叫 公钥 私钥一把加密,另一把解密. (每把都可用于加密,但是对应的那把才能解密)
比如. 一间屋子,有2个门 ,对应2把不同的钥匙. 规则是,前门进,后门出或是后门前,前门出.
如果从前门进,只能使用前门钥匙进. 出去的话从后门出,只能使用后门钥匙.
如果后门进,就得用后门钥匙.出去走前门,只能用前门钥匙出.
那么PHP如何得到这两把钥匙呢,,,,php中,借助openssl实现.首先确定一下是否支持 phpinfo中 搜索 openssl 如果出现下图说明成功支持,本文建议在linux下测试
在生成钥匙之前先要了解一个概念 1个是钥匙文件(里面是钥匙字符串) . 1个是钥匙对象.(专门用于各种操作,理解为实例化后使用)
生成文件 代码如下
1 <?php 2 //第一步,生成一把新钥匙对象这是私钥对象 3 $key = openssl_pkey_new(); 4 //第二步,把生成的私钥,保存成私钥文件 5 openssl_pkey_export_to_file($key, './private.txt'); 6 //下面这句注视的意思是,从现有的私钥文件,获取到私钥对象 7 //$key = openssl_get_privatekey(file_get_contents( './private.txt')); 8 //从私钥中,获取公钥字符串 后面['key']的意思是从这个数组中直接获取该键 9 $key_detail = openssl_pkey_get_details($key)['key']; 10 //把公钥字符串,保存成文件 11 file_put_contents('./public.txt', $key_detail); 12 echo '完成';
刷新生成成功后.如图
到此.钥匙获取完毕. 下一篇讲加密
可以借助linux中的 ssh_keygen命令来生成 代码如下
1 ssh-keygen -t rsa -N '' -f ./key -q
上面代码中
-t是指类型 rsa
-N ''不需要密码
-f 指定生成的私钥文件 是当前目录下的key
-q 不需要废话.直接生成
执行完后当前目录 会生成一个key 和一个key.pub 这两个文件 对应的也是公钥和私钥
注意 php源码中这样定义
1 enum php_openssl_key_type { 2 OPENSSL_KEYTYPE_RSA, 3 OPENSSL_KEYTYPE_DSA, 4 OPENSSL_KEYTYPE_DH, 5 OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA 6 };
可以看出.加密方式有rsa dsa dh 默认是rsa
1 <?php 2 //第一步,取出私钥。 3 $private_key=openssl_get_privatekey(file_get_contents('./private.txt')); 4 //第二步,取出公钥,2种方式 ,一种是从文件中取,如下 5 //$public_key=openssl_get_publickey(file_get_contents('./public.txt')); 6 //另一种是,从私钥里面取 ,理论上内存中计算要比文件中获取要快,两种方法任选其一 7 $public_key=openssl_get_publickey(openssl_pkey_get_details($private_key)['key']); 8 //原字符串 9 $origin_str='中英文Abc+123'; 10 //使用公钥k加密函数进行加密,第一个参数原文,第二个参数是结果。 第三个参数是 公钥对象 (私钥对象会报错) 11 openssl_public_encrypt($origin_str, $crypted, $public_key); 12 //var_dump($crypted是乱码); 13 //使用公钥加密后。只能使用私钥解密函数进行解密,注意第三个参数是私钥对象 14 openssl_private_decrypt($crypted, $decrypted, $private_key); 15 //var_dump($decrypted)得到了原文 16 //也可以 相反的操作。 私钥加密,公钥解密。如下 17 openssl_private_encrypt($origin_str, $crypted, $private_key); 18 openssl_public_decrypt($crypted, $result, $public_key); 19 //vardump($result)也是原文
一般实际应用中,其中一个页面加密后.传给另一个页面密文.然后通过密文进行解密.然后得到结果.
注意,公钥加密,需要私钥解密
或是 私钥加密,公钥解密.
另外.公钥函数只能使用公钥对象. 私钥相同.
还记得之前说过.私钥中提取公钥吗?所以说.最好使用公钥加密,以免传送过程被拦截私钥
自己的代码:
1 <?php 2 //生成私钥文件 3 //$key=openssl_pkey_new(); 4 //openssl_pkey_export_to_file($key,'./1.txt'); 5 6 //从文件中提取 7 //$key=openssl_get_privatekey(file_get_contents('./1.txt')); 8 //$key_dets=openssl_pkey_get_details($key)['key']; 9 // 10 //file_put_contents('./2.txt',$key_dets); 11 12 13 //第一步 提取私钥 14 $privatekey=openssl_get_privatekey(file_get_contents('./1.txt')); 15 //第二步 取出公钥 2种方法 一种文件中取 16 $putkey=openssl_get_publickey(file_get_contents('./5.txt')); 17 18 //另一种从私钥文件中取 19 //$putkey=openssl_get_publickey(openssl_pkey_get_details($privatekey)['key']); 20 //原字符串 21 //var_dump($privatekey,$putkey); 22 23 $orign_str='中文'; 24 openssl_public_encrypt($orign_str,$crypted,$putkey); 25 //var_dump($crypted); 26 openssl_private_decrypt($crypted,$decrypted,$privatekey); 27 var_dump($decrypted); 28 ?>