Javascript到PHP加密通讯的简单实现
互联网上大多数网站,用户的数据都是以明文形式直接提交到后端CGI,服务器之间的访问也大都是明文传输,这样可被一些别有用心之人通过一些手段监听到。对安全性要求较高的网站,比如银行和大型企业等都会使用HTTPS对通讯过程进行加密等处理。
但是使用HTTPS的代价是及其昂贵的。不只是CA证书的购买,更重要的是严重的性能瓶颈,解决方法目前只能采用专门的SSL硬件加速设备如F5的BIGIP等。因此一些网站选择了简单模拟SSL的做法,使用RSA和AES来对传输数据进行加密。原理如下图所示:
这样就在一定程度上提高了数据传输的安全性。但是对于大多数网站来说,大部分数据往往没必要搞这么严密,可以选择性地只针对某些重要的小数据进行加密,例如密码。对于小数据量加密来说,可以没必要使用整个流程,只使用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 明文
- * @param string 证书文件(.crt)
- * @return string 密文(base64编码)
- */
- function publickey_encodeing($sourcestr, $fileName)
- {
- $key_content = file_get_contents($fileName);
- $pubkeyid = openssl_get_publickey($key_content);
- if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid))
- {
- return base64_encode("" . $crypttext);
- }
- 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
显示结果如下:
从这里终于可以看到Javascript中所需要的十六进制公钥密钥:D
转自:http://blog.csdn.net/linvo/article/details/5741942
参考:
JS到PHP使用RSA算法进行加密通讯
相关文章:

MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
2019独角兽企业重金招聘Python工程师标准>>> 1.新建用户 //登录MYSQL >mysql -u root -p >密码 //创建用户 mysql> insert into mysql.user(Host,User,Password) values(‘localhost’,jeecn’,pa…

uml具有多种视图_UML建模与架构文档化
UML(统一建模语言) 是用元模型描述的,元模型是4层元模型体系结构模式中的一层。此模式的其他层次分别是元-元模型层、模型层和用户对象层。在原模型层,UML元模型 又被分解为三个子逻辑包:基础包(核心、扩展机制和数据模型)、行为元素包(描述模…

insert into与insert ignore以及replace into的区别
insert ignore表示,如果表中已经存在相同的记录,则忽略当前新数据; INSERT INTO有无数据都插入,如果主键则不插入; REPLACE INTO 如果是主键插入则会替换以前的数据; 例 1.insert语句一次可以插入多组值,每组值用一对…

德国SNS交友/视频网站Poppen.de的技术架构分享
Poppen.de是一个德国的 交友/ 聊天/ 视频 的SNS网站, 部分内容NSFW,网站采用了很多我们熟悉的技术,像Nginx ,MySQL,CouchDB,Erlang,Memcached的,RabbitMQ(消息服务器),采用了Graphit…

对数函数定义域和值域_呆哥数学每日一题 —— 复合函数值域
如果想要获取往期每日一题电子版,可以加我微信:daigemath366,备注:知乎 每日一题呆哥解析:这是一个函数和复合函数的综合问题首先我们先把原函数的值域求出来先直接求导:导数不容易判断单调性,我…

一些常用工具地址,随时更新中~
2019独角兽企业重金招聘Python工程师标准>>> 一些常用工具地址的备份: 一款比较全的先到化界面编辑器Neditor:https://gitee.com/notadd/neditor 前端ui组件库,类似element ui。iView:https://www.iviewui.com &#…

UNIX环境编程
linux函数分析查询工具1.优先推荐linux 中man命令2.一个不错的中文Linux手册:http://cpp.ezbty.org/manpage3.在线查英文Man手册:http://www.kernel.org/doc/man-pages/http://man7.org/linux/man-pages/dir_all_alphabetic.htmlhttp://linux.about.com/…

WCF优化的几个常规思路
前几天用WCF做项目时发现了一个效率问题,由于系统对效率要求较高,困扰了很长时间终于将问题解决了,写下来为以后的兄弟们参考,第一次写博客有不准确的地方还望同行们多喷多指点,先行谢过啦... 问题场景是这样的&#x…

使复选框选中_勾选复选框单元格变色,自动计数,在Excel中是如何实现的?
Excel中,我们经常会使用复选框来打勾打叉,这是复选框最基本的功能,相信很多小伙伴都会,但今天我跟大家分享的是复选框的其他操作技巧,勾选复选框变色,统计人数。下图中,我们要利用复选框是否打钩…
[短文速读] 重载有暗坑,JVM是如何执行方法的
前言 这将是一个系列文章。原因是自己写了很多文章,也看了很多文章。从最开始的仅仅充当学习笔记,到现在认认真真去写文章去分享。中间发现了很多事情,其中最大发现是:收藏不看!总是想着先收藏以后有时间再看ÿ…

一笔画问题【数据结构-图论】
回家路上听到2个人在说:田字怎么一笔写成,并且笔划不重复。 田 我回家想了许久,觉得无论如何走正常的途径肯定是不行的,投机取巧脑筋急转弯的我不讨论。 那么是否可以找到数学定理? 其实就是欧拉七桥问题:1…

解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别。本篇就以BeanFactory基础容器接口的默认实现类XmlBeanFactory启动流程分析来入门Spring源码的学习。二. 概念要点1. 概念定义Be…

安装多个gcc
删除gcc #yum remove gcc 安装最新的 #yum install gcc 查找gcc源 可先通过“yum list compat-gcc*”查看版本,然后再利用“yum install compat-gccXXX”安装 #yum list compat-gcc* #sudo yum install compat-gcc-34.i686 查看gcc版本 #gcc -v #gcc34 -v参考&…

JAVA - HashMap和HashTable
1. HashMap 1) hashmap的数据结构 Hashmap本质就是一个数组,只是当key值重复时,使用链表的方式来存储重复的key值(拉链法),注意:链表中存放的仍然是key值。如下图示: 当我们往hashmap中put元素…

empress和queen区别_queen与empress
(1)「queen」和「empress」不仅可以用来指称「king」和「emperor」的妻子,也能指代握有正式权力的女性君主。(2) 英国的君主(queen或king)之所以曾经有过empress或emperor的头衔,是因为英国曾统治过印度次大陆, 他们曾是印度的empress或emperor。如今&am…

在UIWindow上加类似于“回到顶部”的按钮
在公司上个版本的开发中遇到了一个UI布局的小问题: 某个页面需要增加一个分享按钮,但是该页面是二级页面,导航栏右边也已经放置了2个button。 起初和老大谈论这个问题的时候想到的方法是导航栏右边加三个button得了~但是一回想,这…

修改mysql 默认字符集 , 默认引擎
cd /var/lib/mysql/gamell vim db.optdefault-character-setutf8default-collationutf8_general_ciwq service mysqld restart或者service mysqld reload默认字符集修改完毕vim /etc/my.cnf[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sockusermysqldefault-stor…

bzoj2724: [Violet 6]蒲公英(分块)
传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有。然而今天做了这道分块的题才发现分块的暴力之美(如果我空间没有开小就更美了) 我们先将整个…

Linux0.01内核根目录Makefile注释
# # Makefile for linux. # If you dont have -mstring-insns in your gcc (and nobody but me has :-) # remove them from the CFLAGS defines. ## #8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码 # AS86 as -0 -a CC86 cc -0 LD86 ld -0# #G…

快速滚动_方老师教滚动快速作文
五年级第一单元作文集阴沉天空中有一小束照着你的阳光。亲爱的孩子,让时间在知识的枝条上、智慧的绿叶上、成熟的果实上留下它勤奋的印痕!罗婉汀作文集自律且努力,别让生活太安逸。亲爱的孩子,耕耘者最信得过自己的汗水࿰…

liunx复制备份命令,copy命令,liunx命令
2019独角兽企业重金招聘Python工程师标准>>> 拷贝到的文件夹 /usr/local/文件夹/需要拷贝的路径文件夹 /usr/local/tomcat/webapps/文件夹/复制命令cp -r /usr/local/文件夹/ /usr/local/tomcat/webapps/文件夹/ 转载于:https://my.oschina.net/u/2336787/blog/635…

20.Valid Parentheses (python)
这道题主要用栈来实现的。什么是栈呢,参照书上的后缀表达式的例子谈谈自己的理解,栈最明显的特征是先进后出。所以可以有效的结合题目中 ()对匹配问题,可以把从列表中获取的符号先存到栈中。 首先建个空列表用于映射栈…

The HipHop Virtual Machine
目前Facebook已将该HipHop虚拟机开源,源代码发布在GitHub上。关于该工具的技术原理在Facebook的开发者页面上有一篇详细的文章介绍,查看这里。如果看不到的可以看下面的转载:Were always looking for ways to make our computing infrastruct…

node建立博客系统遇到的问题,1,乱码。2,multer的使用错误。3使用session问题...
2019独角兽企业重金招聘Python工程师标准>>> 1,乱码 文件存储为utf-8格式后还是报错。 原来这个设置只对新建文件编码有效,旧文件不处理的,我还以为旧文件也给转换了。 2,上传文件的multer模块使用错误。 throw new Ty…

python时间函数入门_calendar在python3时间中有哪些常用函数?怎么用?
想要在python中写代码游刃有余,没有函数的支持是万万不行的。很多小伙伴反映,最近函数的应用知识不够了,所以小编挑选了python3时间中的函数,希望可以帮助大家在处理日历方面更加的迅速。其他更多的函数,大家也可以自行…

9.spark core之共享变量
简介 spark执行操作时,可以使用驱动器程序Driver中定义的变量,但有时这种默认的使用方式却并不理想。 集群中运行的每个任务都会连接驱动器获取变量。如果获取的变量比较大,执行效率会非常低下。每个任务都会得到这些变量的一份新的副本&…

【CSDN2012年度博客之星】需要您的一票,感谢大家的支持
从2004年9月,本人一直将自己工作和学习经验写成博文分享给大家,本人有幸被选为2012年88位候选博客之星,如果各位IT‘er喜欢我的博文,请投我一票,做…

双绞线和同轴电缆
线缆作为连接器件,相当于不同系统之间沟通的“桥梁”,选择线缆类型的好坏,也决定着传输信号的质量,影响着整个系统的稳定性。 (1)特性阻抗 先说一下关于线缆在传输过程中的特性阻抗问题。 特性阻抗是指电缆…

keras训练完以后怎么预测_使用Keras建立Wide Deep神经网络,通过描述预测葡萄酒价格...
你能通过“优雅的单宁香”、“成熟的黑醋栗香气”或“浓郁的酒香”这样的描述,预测葡萄酒的价格吗?事实证明,机器学习模型可以。在这篇文章中,我将解释我是如何利用Keras(tf.keras)建立一个Wide & Deep神经网络,并…
如何发布自己的NPM包(模块)?
1.注册NPM 账号 注册地址:https://www.npmjs.com/。 2.初始化自己要发布的项目 搭建本地环境:安装node.js,包含了npm命令。新建目录,在该目录下,初始化项目:npm init。按照提示填写初始化信息,我…