Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Javascript到PHP加密通讯的简单实现

Javascript到PHP加密通讯的简单实现

作者头像
Java架构师必看
发布于 2021-03-22 07:44:36
发布于 2021-03-22 07:44:36
2.5K0
举报
文章被收录于专栏:Java架构师必看Java架构师必看

互联网上大多数网站,用户的数据都是以明文形式直接提交到后端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/

view plain copy to clipboard print ?

  1. $(document).ready(function(){    
  2. //十六进制公钥  
  3. var rsa_n = "C34E069415AC02FC4EA5F45779B7568506713E9210789D527BB89EE462662A1D0E94285E1A764F111D553ADD7C65673161E69298A8BE2212DF8016787E2F4859CD599516880D79EE5130FC5F8B7F69476938557CD3B8A79A612F1DDACCADAA5B6953ECC4716091E7C5E9F045B28004D33548EC89ED5C6B2C64D6C3697C5B9DD3";   
  4. $("#submit").click(function(){    
  5.     setMaxDigits(131); //131 => n的十六进制位数/2+3  
  6. var key = new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六进制  
  7. var password = $("#password").val();    
  8.     password = encryptedString(key, password);//美中不足,不支持汉字~  
  9.     $("#password").val(password);    
  10.     $("#login").submit();    
  11. });    
  12. });   

PHP加密函数

view plaincopy to clipboardprint?

  1. /** 
  2.  * 公钥加密 
  3.  * 
  4.  * @param string 明文 
  5.  * @param string 证书文件(.crt) 
  6.  * @return string 密文(base64编码) 
  7.  */
  8. function publickey_encodeing(fileName)    
  9. {    
  10. fileName);    
  11. key_content);    
  12.     if (openssl_public_encrypt(crypttext, 
  13.     {    
  14. return base64_encode("" . $crypttext);    
  15.     }  
  16. return False;  
  17. }   

PHP解密函数

view plaincopy to clipboardprint?

  1. /** 
  2.  * 私钥解密 
  3.  * 
  4.  * @param string 密文(base64编码) 
  5.  * @param string 密钥文件(.pem) 
  6.  * @param string 密文是否来源于JS的RSA加密 
  7.  * @return string 明文 
  8.  */
  9. function privatekey_decodeing(fileName,
  10. {    
  11. fileName);    
  12. key_content);    
  13. crypttext);    
  14. fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;  
  15.     if (openssl_private_decrypt(sourcestr, padding))    
  16.     {    
  17.         return sourcestr), "\0") : "".
  18.     }    
  19. return FALSE;    
  20. }    

测试代码

view plain copy to clipboard print ?

  1. define("CRT", "ssl/server.crt"); //公钥文件
  2. define("PEM", "ssl/server.pem"); //私钥文件
  3. //JS->PHP 测试 
  4. _POST['password'];    
  5. txt_en, PEM, TRUE);    
  6. var_dump($txt_de);    
  7. //PHP->PHP 测试  
  8. $data = "测试TEST"; //PHP端支持汉字:D
  9. data, CRT);    
  10. txt_en, PEM);    
  11. var_dump($txt_de);  

代码贴完,有几处需要说明一下。其中十六进制公钥的获取是关键。由于密钥从x.509证书中获取,所以要先生成密钥及证书文件(本文中用的1024位密钥),具体生成方法请自行Google ?。这里重点说一下怎么从中获取十六进制的密钥。

从文件中读取十六进制密钥,本人之前尝试了很多方式,网上说数据是用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算法进行加密通讯

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python3 rsa非对称加密与签名校验
本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/article/python-rsa/
羽翰尘
2019/11/20
2.5K0
PHP 使用非对称加密算法(RSA)
  以前一直对客户端传给服务器的信息加密这一块一脸懵,如果app里面的用户登录信息被抓包拿到了,大写着 username:root,password:123456,  那不是很尴尬。
Lansonli
2021/10/09
1.9K0
RSA加密解密(无数据大小限制,php、go、java互通实现)
RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内容进行分段。
双鬼带单
2019/07/30
5K0
Php和Java之间RSA加解密实战
最近一项目采用分层架构,前端是Php,后端是Java,一些敏感数据传输采用加密处理,中间调试起来也是非常麻烦,因为每个语言实现的不一样,Php因为语言层面已经封装了,使用起来不用关注太多,但要了解原理就得看C语言写的代码了,反过来Java的实现就繁琐一些,对使用者不太友好,不过相对来说也比较容易了解原理了。
心平气和
2021/04/01
1.2K0
RSA工具集-openssl,rsatool,RsaCtfTool,RSAtool
用法一:已知公钥(自动求私钥) –publickey,密文 —-uncipherfile。 将文件解压复制到RsaCtfTool里:
小简
2022/12/29
1.9K0
RSA工具集-openssl,rsatool,RsaCtfTool,RSAtool
PHP 加密与解密
在现代 Web 应用中,数据安全是至关重要的,尤其是处理用户的敏感信息时,如密码、个人身份信息、信用卡号等。为了保护这些敏感数据不被黑客窃取或篡改,我们常常需要使用加密技术对数据进行保护。PHP 作为一种广泛使用的服务器端脚本语言,也提供了多种加密和解密的方法,帮助开发者实现数据的安全保护。
繁依Fanyi
2025/02/06
5040
加密工具类,提供RSA & AES & DES 等加密解密方法工具类介绍加密解密概念使用方法公钥、私钥生成
github项目地址 https://github.com/XHTeng/XHCryptorTools 工具类介绍 框架从 CryptoExercise(苹果3.0时的包)进行提取扩展 iOS 系统自带相关函数说明,框架主要使用前两种: SecKeyEncrypt 使用公钥对数据加密 SecKeyDecrypt 使用私钥对数据解密 SecKeyRawVerify 使用公钥对数字签名进行验证 SecKeyRawSign 使用私钥生成数字签名 普遍的加密方法:客户端用RSA的公钥加密AES的秘钥
用户2141756
2018/05/18
2.3K0
敏感数据加密方案及实现
本文首发于政采云前端团队博客:敏感数据加密方案及实现 https://www.zoo.team/article/data-encryption
政采云前端团队
2020/11/05
3.6K0
敏感数据加密方案及实现
加密解密(RSA)非对称加密算法
RSA加解密是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman于1977年提出。它的概念是基于两个密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。
一百减一是零
2024/08/04
3180
java与openssl的rsa算法互
说明    1.java生成的公私钥格式为 pkcs8, 而openssl默认生成的公私钥格式为 pkcs1,两者的密钥实际上是不能直接互用的     2.java采用的rsa默认补齐方式是pkcs1, 因此互用的时候需要将openssl中的补齐方式设置为RSA_PKCS1_PADDING     3.rsa加密中,加密数据长度有限制,不能超过密钥长度-11, 如密钥为1024位,则最长的加密数据位117字节; 加密后的密文长度总是为密钥的一半,即1024位的密文为512位 RSA加密常用的填充方式有下
一灰灰blog
2018/02/06
4.2K0
支付平台架构:终端安全技术实现
前蚂蚁集团宣布即将IPO之后,9月11日晚间,以金融支付起家的京东数科也要上市了。近年来,第三方支付业务的资金规模不断扩大,支付业务量稳步增长,“第三方支付”及“移动支付”已成为年度搜索热词,支付平台作为互联网产品及其在商业化过程中信息流和资金流的支撑,也成为国外内各大互联网公司必建的基础平台之一。 安全交易是互联网产品电子商务发展的核心内容之一,支付系统的安全则是安全交易的关键所在。 对于从事支付行业的第三方支付机构来说,终端数据的安全防护无疑是支付业务发展的重要保证之一,是安全防护长城的第一关。支付系统
博文视点Broadview
2023/05/19
1.2K0
支付平台架构:终端安全技术实现
RSA der加密 p12解密以及配合AES使用详解
在前面的文章中我有说过AES和RSA这两种加密方式,正好在前段时间再项目中有使用到,在这里再把这两种加密方式综合在一起写一下,具体到他们的使用,以及RSA各种加密文件的生成。
Mr.RisingSun
2019/08/14
2.3K0
RSA der加密 p12解密以及配合AES使用详解
OpenSSL配置HTTPS
OpenSSL 是一个实现加密和认证的软件,而OpenSSH 是实现 SSH 远程安全登录的软件(其安全功能借用了OpenSSL),其提供秘钥证书管理、对称加密和非对称加密等功能
晚上没宵夜
2021/12/21
1.7K0
OpenSSL配置HTTPS
NodeJS模块研究 - crypto
这次研究下 nodejs 的 crypto 模块,它提供了各种各样加密算法的 API。这篇文章记录了常用加密算法的种类、特点、用途和代码实现。其中涉及算法较多,应用面较广,每类算法都有自己适用的场景。为了使行文流畅,列出了本文记录的几类常用算法:
心谭博客
2020/04/21
2.4K0
https通讯基础知识汇总
trustStore是存储可信任的公钥,如6中红色字体中trustStore的生成过程就是把从keyStore导出的公钥证书导入到trustStore中。
全栈程序员站长
2022/08/09
1.4K0
https通讯基础知识汇总
加密与安全_AES & RSA 密钥对生成及PEM格式的代码实现
在现代信息安全中,加密算法扮演着至关重要的角色。今天我们来聊聊两种常见的加密算法——RSA和AES,用通俗易懂的语言带大家理解它们的核心原理和优缺点。
小小工匠
2024/05/27
8360
C语言实例_文件内容加密与解密
(1)保护数据安全:加密可以将文件内容转化为不可读或难以理解的形式,防止未经授权的人员获取敏感信息。只有拥有正确解密密钥的人员才能还原出可读的文件内容。这样可以有效地防止数据泄露、窃取或篡改,保护用户的隐私和机密信息。
DS小龙哥
2023/08/27
9990
C语言实例_文件内容加密与解密
[Linux] 使用openssl实现RSA非对称加密
参数:genrsa 生成密钥 -out 输出到文件 rsa_private_key.pem 文件名 1024 长度
唯一Chat
2019/09/11
3.7K0
PHP的OpenSSL加密扩展学习(二):非对称加密
上篇文章,我们了解了关于对称和非对称加密的一些相关的理论知识,也学习了使用 OpenSSL 来进行对称加密的操作。今天,我们就更进一步,学习 OpenSSL 中的非对称加密是如何实现的。
硬核项目经理
2020/11/10
9180
Go加密算法总结
它是一种数据编码方式,虽然是可逆的,但是它的编码方式是公开的,无所谓加密。本文也对Base64编码方式做了简要介绍。
iginkgo18
2020/12/22
1.7K0
推荐阅读
相关推荐
python3 rsa非对称加密与签名校验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档