码迷,mamicode.com
首页 > 编程语言 > 详细

PHP 使用非对称加密算法(RSA)

时间:2018-10-14 00:30:02      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:网站   linux   算法   web   openssl   __file__   用户登录   文件   username   

  以前一直对客户端传给服务器的信息加密这一块一脸懵,如果app里面的用户登录信息被抓包拿到了,大写着 username:root,password:123456,  那不是很尴尬。

偶然做版权输入的时候遇到了rsa,在支付宝支付的时候也接触过,当时不知道这是啥子,现在才知道。

他能保证,客户端给出的信息,只有拥有私钥的服务器才能看,其他人看的都是乱码,嘿嘿。

非对称加密算法
需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;
如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

注意以上的一个点,公钥加密的数据,只有对应的私钥才能解密

在日常使用中是酱紫的:
将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端

客户端用公钥加密过后,数据只能被拥有唯一私钥的服务器看懂。

具体实现:

1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

 1 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:
 2 a、openssl genrsa -out rsa_private_key.pem 1024
 3 b、openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
 4 c、openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
 5 
 6 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem
 7 第二条命令将原始 RSA私钥转换为 pkcs8格式
 8 第三条生成RSA公钥 rsa_public_key.pem
 9 
10 上面几个就可以看出:通过私钥能生成对应的公钥

也有一些网站提供生成rsa公钥私钥的服务:http://www.bm8.com.cn/webtool/rsa/

2、PHP的加密解密类库:

<?php


class Rsa {
 
    /**     
     * 获取私钥     
     * @return bool|resource     
     */    
    private static function getPrivateKey() 
    {        
        $abs_path = dirname(__FILE__) . /rsa_private_key.pem;
        $content = file_get_contents($abs_path);    
        return openssl_pkey_get_private($content);    
    }    

    /**     
     * 获取公钥     
     * @return bool|resource     
     */    
    private static function getPublicKey()
    {   
        $abs_path = dirname(__FILE__) . /rsa_public_key.pem;
        $content = file_get_contents($abs_path);    
        return openssl_pkey_get_public($content);     
    }

    /**     
     * 私钥加密     
     * @param string $data     
     * @return null|string     
     */    
    public static function privEncrypt($data = ‘‘)    
    {        
        if (!is_string($data)) {            
            return null;       
        }        
        return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null;    
    }    

    /**     
     * 公钥加密     
     * @param string $data     
     * @return null|string     
     */    
    public static function publicEncrypt($data = ‘‘)   
    {        
        if (!is_string($data)) {            
            return null;        
        }        
        return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null;    
    }    

    /**     
     * 私钥解密     
     * @param string $encrypted     
     * @return null     
     */    
    public static function privDecrypt($encrypted = ‘‘)    
    {        
        if (!is_string($encrypted)) {            
            return null;        
        }        
        return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null;    
    }    

    /**     
     * 公钥解密     
     * @param string $encrypted     
     * @return null     
     */    
    public static function publicDecrypt($encrypted = ‘‘)    
    {        
        if (!is_string($encrypted)) {            
            return null;        
        }        
    return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null;    
    }

}

调用demo:

<?php

require_once "Rsa.php";
$rsa = new Rsa();
$data[name] = Tom;
$data[age]  = 20;
$privEncrypt = $rsa->privEncrypt(json_encode($data));
echo 私钥加密后:.$privEncrypt.<br>;

$publicDecrypt = $rsa->publicDecrypt($privEncrypt);
echo 公钥解密后:.$publicDecrypt.<br>;

$publicEncrypt = $rsa->publicEncrypt(json_encode($data));
echo 公钥加密后:.$publicEncrypt.<br>;

$privDecrypt = $rsa->privDecrypt($publicEncrypt);
echo 私钥解密后:.$privDecrypt.<br>;

代码截图实例:

技术分享图片

转载自:

作者:明月轻倚深秋

链接:https://www.jianshu.com/p/9dc5c8a93308

來源:简书

PHP 使用非对称加密算法(RSA)

标签:网站   linux   算法   web   openssl   __file__   用户登录   文件   username   

原文地址:https://www.cnblogs.com/xuweiqiang/p/9784584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!