Javascript 到 PHP 加密通讯的简单实现-php教程

资源魔 29 0
互联网上年夜少数网站,用户的数据都是以明文方式间接提交到后端CGI,效劳器之间的拜访也年夜都是明文传输,这样可被一些居心叵测之人经过一些手法监听到。对平安性要求较高的网站,比方银行以及年夜型企业等城市应用HTTPS对通信进程进行加密等解决。

然而应用HTTPS的价值是及其低廉的。不仅是CA证书的采办,更首要的是重大的功能瓶颈,处理办法今朝只能采纳专门的SSL硬件减速设施如F5的BIGIP等。因而一些网站抉择了简略模仿SSL的做法,应用RSA以及AES来对传输数据进行加密。原理以下图所示:

9b006998c6515752f0446b0916a1b38.png

这样就正在肯定水平上进步了数据传输的平安性。然而关于年夜少数网站来讲,年夜局部数据往往没须要搞这么紧密,能够抉择性地只针对某些首要的小数据进行加密,例如明码。关于小数据量加密来讲,能够没须要应用整个流程,只应用RSA便可,这样将年夜年夜简化流程。

为何是小数据量?由于绝对于对称加密来讲,非对称加密算法跟着数据量的添加,加密进程将变的巨慢无比。以是实际数据加密普通城市选用对称加密算法。因而PHP中的openssl扩大公私钥加密函数也只支持小数据(加密时117字节,解密时128字节)。

网上已有一些AES、RSA的开源Javascript算法库,正在PHP中更可间接经过相干扩大来完成(AES算法能够经过mcrypt的相干函数来完成,RSA则可经过openssl的相干函数完成),而不必像网上说的用纯PHP代码完成算法。因为篇幅所限,本文只引见Javascript以及PHP的RSA加密通信完成,拿明码加密为例。

先上代码:

前端加密

起首加载三个RSA的js库文件,可到这里下载 http://www.ohdave.com/rsa/

$(document).ready(function(){  
//十六进制公钥  
var rsa_n = "C34E069415AC02FC4EA5F45779B7568506713E9210789D527BB89EE462662A1D0E94285E1A764F111D553ADD7C65673161E69298A8BE2212DF8016787E2F4859CD599516880D79EE5130FC5F8B7F69476938557CD3B8A79A612F1DDACCADAA5B6953ECC4716091E7C5E9F045B28004D33548EC89ED5C6B2C64D6C3697C5B9DD3"; 
	
$("#submit").click(function(){  
    setMaxDigits(131); //131 => n的十六进制位数/2+3  
    var key = new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六进制  
    var password = $("#password").val();  
    password = encryptedString(key, password);//十全十美,没有支持汉字~  
    $("#password").val(password);  
    $("#login").submit();  
});  
});

PHP加密函数

/** 
 * 私钥解密 
 * 
 * @param string 密文(base64编码) 
 * @param string 密钥文件(.pem) 
 * @param string 密文能否起源于JS的RSA加密 
 * @return string 明文 
 */  
function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE)
{  
    $key_content = file_get_contents($fileName);  
    $prikeyid    = openssl_get_privatekey($key_content);  
    $crypttext   = base64_decode($crypttext);  
    $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
    if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding))  
    {  
        return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr;  
    }  
    return FALSE;  
}

PHP解密函数

/** 
 * 私钥解密 
 * 
 * @param string 密文(base64编码) 
 * @param string 密钥文件(.pem) 
 * @param string 密文能否起源于JS的RSA加密 
 * @return string 明文 
 */  
function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE)
{  
    $key_content = file_get_contents($fileName);  
    $prikeyid    = openssl_get_privatekey($key_content);  
    $crypttext   = base64_decode($crypttext);  
    $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
    if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding))  
    {  
        return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr;  
    }  
    return FALSE;  
}

测试代码

define("CRT", "ssl/server.crt"); //公钥文件
define("PEM", "ssl/server.pem"); //私钥文件
//JS->PHP 测试 
$data = $_POST['password'];  
$txt_en = base64_encode(pack("H*", $data)); //转成base64格局 
$txt_de = privatekey_decodeing($txt_en, PEM, TRUE);  
var_dump($txt_de);  
//PHP->PHP 测试  
$data = "测试TEST"; //PHP端支持汉字:D
$txt_en = publickey_encodeing($data, CRT);  
$txt_de = privatekey_decodeing($txt_en, PEM);  
var_dump($txt_de);

代码贴完,有几处需求阐明一下。此中十六进制公钥的猎取是要害。因为密钥从x.509证书中猎取,以是要学生成密钥及证书文件(本文顶用的1024位密钥),详细天生办法请自行Google :P。这里重点说一下怎样从中猎取十六进制的密钥。

从文件中读取十六进制密钥,自己以前测验考试了不少形式,网上说数据是用ASN.1编码过的……囧~ 最初有意中留意到linux shell下openssl貌似能够从私钥文件(key或pem)提取。

openssl asn1parse -out temp.ans -i -inform PEM < server.pem

显示后果以下:

8bf3bd0787886c703f1994cfc0fbbcb.png

从这里终于能够看到Javascript中所需求的十六进制公钥密钥:D

以上就是Javascript 到 PHP 加密通信的简略完成的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!