了解PHP的几种常见的加密方式

常用的几种加密方式

md5加密

Md5是一种单向的加密技术,不可逆,不能进行解密

crypt加密

crypt()为单向加密,跟md5差不多一样

sha1加密

跟md5很像,不同的是sha1()默认情况下返回40个字符的散列值,传入参数性质一样,第一个为加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,sha1()则会返回原始的20 位原始格式报文摘要
sha1()也是单行加密,没有逆向解密算法

urlencode

一个参数,传入要加密的字符串(通常应用于对URL的加密),
urlencode为双向加密,可以用urldecode来加密(严格意义上来说,不算真正的加密)

base64编码加密

base64_encode()接受一个参数,也就是要编码的数据(这里不说字符串,是因为很多时候base64用来编码图片)
base64_encode()为双向编码,可用base64_decode()来解码。(实际上这也不算加密,只是编码)

AES加密

对称加密,只有一把密钥,只要密钥不泄露,AES加密还是十分安全的

RSA加密

非对称加密,一个公钥,一个密钥两把钥匙,优点是安全可靠

md5,crypt和sha1统称hash算法,urlencode和base64也称为编码。他们都不是严格意义上面的加密。下面重点说下AES和RSA加密。这是最常见的两种加密方式。要理解这两种加密方法。
我先以我自己的理解讲一个故事。有3个国家在打仗,A国和B国是同盟国 对付C国。A国需要和B国共享情报,于是派使者传话给B国约定了彼此之间信件往来的规则。
比如说英文字母A用Z代替,B用3代替(这个加密的规则就是密钥,这里只是举个例子,真实情况不会这么简单),只要密钥不泄露出去,C国就算截取到他们之家的通信也不大可能读懂他们之间的情报。(对称加密)
这种情况持续了很久,C国一直受2个国家的联合打压,眼看就要溃败了。这时候C国军师收买了当时A国传话给B国的使者得到他们之间的通信规则(密钥)。于是C国掌握了情报扭转了局势。
这时候A国和B觉得这样下去不是办法,就算我换一个通信规则,C国也很可能可以获取到。到底要怎么交换情报呢?这时候有人提议用两把钥匙的方式对情报进行加密。A国先对情报进行一次加密,然后随即用密钥1(私钥)解密,但是由于没有用密钥2解密,情报还是看不到,然后就把
密钥2(公钥)发给B国,B国很轻松用密钥2解开了情报。情报内容为”下次什么时候发起进攻?“。这时候C国也窃取到密钥然后翻译了以上情报,大喜。此时,B国拿到情报准备回复,回复内容”下星期一“进行加密。然后发回给A国。
这时候C国又窃取到B国发回给A国的密文,正想解密。可是他怎么解都解不出来。因为解密一定要两套密钥具备才可以。这时候C国彻底懵逼了。
总结:AES加密很容易理解,就是通过一特地的.密钥对一组数据进行加密.AES加密也是对称加密的典型.RSA其实也很好理解,你只要知道理解RSA是要用到两个密钥就可以了,至于什么私钥,公钥其实没有一个统一的标准,不同情况下,私钥也可以是公钥,公钥也可以是私钥,这取决于你怎么使用.
再举个栗子.你们有没有开发国微信支付或者支付宝支付,他们都是用的RSA加密对支付信息进行加密.用户首先生成公钥,密钥.公钥给支付平台,密钥自己保留.用户发起支付,私钥加密支付信息,平台公钥加密.这时候平台的作用是验证你发起的支付信息跟你的身份的一致性.是验签的作用.平台收到你的支付信息,会用公钥加密回调信息返回给用户.这时候是公钥加密,私钥解密.此时,哪怕黑客拿到平台的公钥,也无法伪造正确的加密信息,因为黑客只有公钥是无法解密的.

下面是PHP的RSA加密类仅供参考

<?php
namespace encrypt; 
 
class Rsa{
    private static $_privkey = '';
    private static $_pubkey = '';
    private static $_isbase64 = false;
	
    /**
     * 初始化key值
     * @param  string  $privkey  私钥
     * @param  string  $pubkey   公钥
     * @param  boolean $isbase64 是否base64编码
     * @return null
     */
    public  function init($privkey, $pubkey, $isbase64 = false)
	{
        self::$_privkey = $privkey;
        self::$_pubkey = $pubkey;
        self::$_isbase64 = $isbase64;
    }
    /**
     * 私钥加密
     * @param  string $data 原文
     * @return string       密文
     */
    public  function priv_encode($data)
	{
        $outval = '';
        $res = openssl_pkey_get_private(self::$_privkey);
        openssl_private_encrypt($data, $outval, $res);
        if(self::$_isbase64){
            $outval = base64_encode($outval);
        }
        return $outval;
    }
	
    /**
     * 公钥解密
     * @param  string $data 密文
     * @return string       原文
     */
    public  function pub_decode($data)
	{
        $outval = '';
        if(self::$_isbase64){
            $data = base64_decode($data);
        }
        $res = openssl_pkey_get_public(self::$_pubkey);
        openssl_public_decrypt($data, $outval, $res);
        return $outval;
    }
    /**
     * 公钥加密
     * @param  string $data 原文
     * @return string       密文
     */
    public  function pub_encode($data)
	{
        $outval = '';
        $res = openssl_pkey_get_public(self::$_pubkey);
        openssl_public_encrypt($data, $outval, $res);
        if(self::$_isbase64){
            $outval = base64_encode($outval);
        }
        return $outval;
    }
	
    /**
     * 私钥解密
     * @param  string $data 密文
     * @return string       原文
     */
    public  function priv_decode($data){
        $outval = '';
        if(self::$_isbase64){
            $data = base64_decode($data);
        }
        $res = openssl_pkey_get_private(self::$_privkey);
        openssl_private_decrypt($data, $outval, $res);
        return $outval;
    }
    /**
     * 创建一组公钥私钥
     * @return array 公钥私钥数组
     */
    public function new_rsa_key()
	{
        $res = openssl_pkey_new();
        openssl_pkey_export($res, $privkey);
        $d = openssl_pkey_get_details($res);
        $pubkey = $d['key'];
        return array(
            'privkey' => $privkey,
            'pubkey'  => $pubkey
        );
    }
}
 
 		//举个例子
		$Rsa = new Rsa();
		$keys = $Rsa->new_rsa_key(); //生成完key之后应该记录下key值,这里省略

		$privkey = $keys['privkey'];
		$pubkey  = $keys['pubkey'];
		
		//初始化rsaobject
		$Rsa->init($privkey, $pubkey,TRUE);
		
		//原文
		$data = '出门记得带口罩';
		 
		//私钥加密示例
		$encode = $Rsa->priv_encode($data);
		$ret = $Rsa->pub_decode($encode);
 
 
		 //公钥加密示例
		$encode = $Rsa->pub_encode($data);
		$ret = $Rsa->priv_decode($encode);
		print_r($ret);
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值