首页 > 编程语言 >RSA非对称加密,前端JS加密,后端PHP解密

RSA非对称加密,前端JS加密,后端PHP解密

时间:2024-08-06 09:41:06浏览次数:8  
标签:公钥 加密 RSA JS 解密 key 私钥 data

RSA公钥/私钥在线生成:http://web.chacuo.net/netrsakeypair

通过以上网址生成公钥/私钥对,私钥格式这里选择【PKCS#1】,如:

公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN3El4yr2maFvDo5PKIzkkiitJ
ZEOTLNINH0RD0PL5Lob+YzbRJO6DX27SRuHcdlK7mFtkQvooW/oslsNxfpy/55WO
Rd4EcWoPG03oraX4pw3Yokw1XcMsfVv1exvcf0kaVKSThmJaN3KrgE4B+Ht2jRJ1
deHi3FFuPa6wJs0OoQIDAQAB
-----END PUBLIC KEY-----

私钥

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDN3El4yr2maFvDo5PKIzkkiitJZEOTLNINH0RD0PL5Lob+YzbR
JO6DX27SRuHcdlK7mFtkQvooW/oslsNxfpy/55WORd4EcWoPG03oraX4pw3Yokw1
XcMsfVv1exvcf0kaVKSThmJaN3KrgE4B+Ht2jRJ1deHi3FFuPa6wJs0OoQIDAQAB
AoGABGAAFaPRZ4cPA3AC3VkKYpFqTmDyB0c5q5e5Ct+7bH1WaWc+e4U111ECVI09
MKSaisFu4bPkyvBoVc0FHmqa3eSQz9uRPCn3A9WsQRBaZtsXMJ3/iG6Lt7kwzZiY
olD25+wQb3OZvlLmoX1iU6Ihv0EnCGP47pUUB0PhM+8a+fECQQDRehgyB0oN2gZS
EXN1tJ3wDzHdddV1588T+LJEKYn426BzLMKMNYfg2vnZh6X00IkX4tdS8Lqe8sP0
P9toHJilAkEA+5SUEoj+nMeJDJQeP2tXqEGHrkE5Xys74WRTZzw3vxXHr8ao5Ktl
UDGw904CnsULOcqsHzcpiICR/U5FbaiBTQJAZoCtOEXS2eZW82+wpOdF5YM57llL
o89TyD0I1kvRROILqHA9nqhPHhto6SX0clBc1UBeByre1wqKEonwzgg4NQJBAPix
koKUHCW9dfQSQ6hro1Z3mPmgDmfOpD4V4ACwXWcuz5wqZPDPobJZvNdrrVln7cXu
XKHq9Mq0VhyyEB3rsg0CQCa15dER0X/RLYrnyU3A3KmJLOlCz6Y6DFI0NtQKnp1K
ujDkIs6RM+4ZYGi+8esm7ubcdpvdTUSnBlkyZu2jJ2k=
-----END RSA PRIVATE KEY-----

jsencrypt.js
前端JS类库使用:jsencrypt.js

项目地址:https://github.com/travist/jsencrypt

下载该项目,在前端页面中引用js库即可

<script type="text/javascript" src="./jsencrypt.js"></script>

前端加密,在表单提交前执行加密

var password = $("#password").val();
var encrypt = new JSEncrypt();
encrypt.setPublicKey('这里填写公钥');
var encrypted = encrypt.encrypt(password);
$("#password").val(encrypted);

后端解密

$password = $_POST['password'];//获取密码
$private_key = "这里填写私钥";
$pi_key =  openssl_pkey_get_private($private_key);
$decrypted = "";//解密后的密码存放在这个变量
openssl_private_decrypt(base64_decode($password),$decrypted,$pi_key);//这里使用base64_decode是因为再前端到后端的传输过程中浏览器会自动对数据进行base64_encode
$password = $decrypted;//解密后的密码

前端JS加密、解密

var data = 'testData';
 
//公钥加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey('这里填写公钥');
var data_encrypted = encrypt.encrypt(data);
 
//私钥解密    
var decrypt = new JSEncrypt();
decrypt.setPrivateKey('这里填写私钥');
var data_decrypted = decrypt.decrypt(data_encrypted);
 
if (data == data_decrypted) {
    console.log('加密、解密成功');
}

后端PHP加密、解密

$pi_key =  openssl_pkey_get_private('这里填写私钥');//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$pu_key = openssl_pkey_get_public('这里填写公钥');//这个函数可用来判断公钥是否是可用的
 
$data = "testData";//原始数据
$data_encrypted = "";//加密后的数据
$data_decrypted = "";//解密后的数据
 
//私钥加密
openssl_private_encrypt($data, $data_encrypted, $pi_key);
$data_encrypted = base64_encode($data_encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
//公钥解密
openssl_public_decrypt(base64_decode($data_encrypted), $data_decrypted, $pu_key);//私钥加密的内容通过公钥可用解密出来
 
echo $data.'<br/>';
echo $data_encrypted.'<br/>';
echo $data_decrypted.'<br/>';
 
 
$data_encrypted2 = "";//加密后的数据
$data_decrypted2 = "";//解密后的数据
 
//公钥加密
openssl_public_encrypt($data, $data_encrypted2, $pu_key);
$data_encrypted2 = base64_encode($data_encrypted2);
openssl_private_decrypt(base64_decode($data_encrypted2), $data_decrypted2, $pi_key);
 
echo $data.'<br/>';
echo $data_encrypted2.'<br/>';
echo $data_decrypted2.'<br/>';

jsencrypt.js生成密钥对:

var crypt = new JSEncrypt({default_key_size: 1024});
crypt.getKey();
crypt.getPrivateKey();
crypt.getPublicKey();

标签:公钥,加密,RSA,JS,解密,key,私钥,data
From: https://www.cnblogs.com/chenchenphp/p/18344494

相关文章

  • js、php实现前后端数据的base64编码和解码
    客户要求密码必须加密后再传送。javascript代码的加密函数:<scriptlanguage='javascript'>functionutf16to8(str){varout,i,len,c;out="";len=str.length;for(i=0;i<len;i++){c=str.charCodeAt(i);if(......
  • 一个基础的js,html示例程序
    需求背景:一个html,一个js脚本。要求html里面提供若干按钮。第1个按钮,点击之后,触发js里面的add函数,第2个按钮点击之后触发js里面的del函数。第3个按钮,点击之后,在按钮右侧,显示当前时间,每点击一次刷新下一次。还有,在每个函数调用里面,函数开通打印当前时间戳(精确到毫秒),函......
  • JS历理 文本高度自适应
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="renderer"content="webkit"><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1">......
  • 如何理解js的异步
    js是一门单线程的语言,这是因为他运行在浏览器的渲染主线程中,而渲染主线程只有一个,渲染主线程担任着诸多的工作,渲染页面、执行js、css、计时器等等都在其中运行。如果使用同步的方式,就很有可能会导致主线程堵塞,从而导致消息队列中的其它任务无法进行执行,这样一来,一方面会导致......
  • JSON parse error: Cannot deserialize instance of `java.lang.Long` out of START_O
    这个问题的实际原因就是:    后端id(Long类型)用的雪花算法生成主键id    后端生成id位:1820397662671867904    前端查询id的结果为:1820397662671868000产生的原因:    后端生成为19位,前端接受并展示,使用的类型是number类型是16位   ......
  • 密码学基础-数据加密
    密码学基础-对称加密与非对称加密概述安全通常从四个方面来定义:机密性完整性合法性(可用性,合法的数据才可用)不可否认性(发送方不可否认发送过的消息,接收方不可否认接收过的消息)对当前主要的电子设备而言,代码以及数据的读、写、使用(执行)、传输是主要的研究方向。每当讨论......
  • 从JS到Vue
    JavaScript-Vue JS引入方式基础语法输出语句 变量数据类型运算符函数对象ArrayStringJSONBOMWindowLocationDOM获取元素案例 事件事件绑定常见事件案例Vue快速入门指令v-bind和v-modelv-onv-if与v-showv-for案例生命周期 JS引入方式......
  • 未加密的__VIEWSTATE参数(中危)
    原文链接:https://blog.csdn.net/qq_44828901/article/details/122218593前言今天日常测站的时候,AWVS扫到一个“nencrypted__VIEWSTATEparameter(未加密的__VIEWSTATE参数)”,正好看过一个大佬的帖子,手动验证一波(手动滑稽)。一、漏洞说明简单理解:表单提交在遇到服务器返回错误时候......
  • nodejs遇到的一个小问题分享给大家
    今天在调试项目的时候突然发现  const{name}=ctx.request.body 无法接收到参数了,后来检查了一下代码发现路由中间件和bodyparser中间件的加载顺序错了,导致无法接收参数,正确应该是这样:app.use(bodyParser());app.use(router.routes()).use(router.allowedMethods());......
  • 记一次JSF异步调用引起的接口可用率降低
    前言本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF1,7.5-HOTFIX-T6版本。起因问题背景1.广告投放系统是典型的I/O密......