联网上大多数网站,用户的数据都是以明文形式直接提交到后端 CGI ,服务器之间的访问也大都是明文传输,这样可被一些别有用心之人通过一些手段监听到。对安全性要求较高的网站,比如银行和大型企业等都会使用 HTTPS 对通讯过程进行加密等处理。常见js加密应用登录数据,路径地址
但是使用 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 加密函数
/** * 公钥加密 明文长度不能大于117,不支持分片 * * @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 中所需要的十六进制公钥密钥
最后总结下本方案几处优点:
1、安全性高。基于非对称的RSA算法加密数据,只要在私钥不被暴露的前提下,密钥长度足够长,短时间内基本是无法破解的。
2、使用方便。前端使用现成的JS库来实现加密,PHP端则可直接使用现成的openssl扩展,而不用RSA的PHP源码实现或自己开发扩展。
3、速度靠谱。由于RSA解密算法相当复杂,而该操作交由PHP端扩展来实现,效率上比网上的PHP代码要高许多。
4、便于升级。密钥是直接从linux下openssl工具生成的证书中获取,不仅不用其他密钥生成工具,也方便今后升级到真正的HTTPS。
php后端解密
<?php //Base64.js echo base64_decode($str); //sha1.js echo sha1('a')==js hex_sha1; ?>
相关推荐
RSA是一种非对称加密算法,它是公钥密码学的一个重要里程碑。这个算法由Ron Rivest、Adi Shamir和Leonard ...掌握这些知识点可以帮助你理解和运用这个"RSA 前端加密C#后端解密"的程序,确保数据在传输过程中的安全。
总之,这个实例提供了一种实用的方法,通过JavaScript在前端加密数据,Java在后端解密,从而在Web应用中建立一个基本的数据安全链路。理解并实施这种技术对于任何涉及敏感数据传输的Web开发者都是必要的。
VB.NET、C#后端服务器解密"涉及到的是一个常见的安全实践,即在客户端(JavaScript)对敏感数据(如账号密码)进行加密,然后在服务器端(VB.NET或C#)进行解密,以保护数据在传输过程中的安全性。 DES(Data ...
前端加密登录是一种增强用户信息安全的策略,它涉及到客户端(前端)对敏感信息如用户名和密码进行加密,然后将加密后的数据发送到服务器(后端)进行解密。这样的做法可以有效防止在网络传输过程中数据被窃取,增加...
在"RSA_DEMO"这个压缩包文件中,可能包含了实现RSA加密交互的示例代码,包括生成密钥对的脚本、前端加密的JavaScript代码以及后端解密的服务器端代码。通过分析这些代码,我们可以更深入地了解RSA在实际项目中的运用...
"JS加密C#解密"的主题涉及前端JavaScript进行数据加密,然后在后端.NET环境中进行解密的技术方案。这种做法的主要目的是确保在网络传输过程中,敏感信息不被窃取或篡改,增强系统的安全性。 首先,我们需要了解...
这是一个典型的客户端加密、服务器解密的模式,可以有效防止数据在传输过程中被截取。 **AES加密算法** AES(Advanced Encryption Standard)即高级加密标准,是一种广泛应用于现代加密技术的块密码。它基于替换和...
在标题提到的"小程序+java后端统一 des 加密解密"中,我们主要讨论的是使用DES(Data Encryption Standard)算法进行数据加密和解密的实践,这涉及到小程序客户端与Java后端服务之间的安全通信。 DES是一种对称加密...
源码的应用场景: ...这样客户端只需要知道rsa加密方式和公钥,前台不知道私钥是无法解密的,此解决方案还是相对比较安全的。 使用源码的注意事项: http://blog.csdn.net/wu_jia123/article/details/50553128
2. 后端解密:在服务器端使用 C# 语言对接收到的密文进行解密,以获取原始数据。解密过程中使用私钥对密文进行解密,生成明文。 3. JavaScript 库 JsEncrypt:JsEncrypt 是一个 JavaScript 库,用于在客户端对数据...
三、后端解密 1. 接收加密数据:后端接收到加密的数据后,使用相应的密钥进行解密。对于非对称加密,服务器持有私钥,可以解密由公钥加密的数据。 2. 安全验证:在解密前,应验证数据的完整性,例如通过检查消息...
本项目提供了JavaScript前端和Java后端的AES加密解决方案,确保数据在客户端与服务器间的安全传输。 前端部分,JavaScript的实现通常依赖于如CryptoJS这样的库,它提供了AES加密的API接口。开发者可以通过这个库,...
在Flutter和Java混合开发的场景中,"flutter加密java解密"的主题涉及到如何在Flutter客户端与Java后台之间进行安全的数据交互,确保信息在传输过程中不被窃取或篡改。这里我们将详细讨论如何实现这一目标,并保证App...
`security.js`可能是一个包含RSA加密和解密功能的JavaScript库,可能提供了一种在前端实现RSA加解密的方法。在Web应用中,这种库常用于在用户与服务器之间安全地传输敏感数据,如登录凭证、信用卡信息等。`security....
八成网站登录口令“裸身待缚” 电商类全军覆没,在用户口令传输过程中,仍然存在很多隐患。一般而言,用户在登录网站...而《报告》中显示,大部分样本网站在传输口令时,没有做加密处理,直接将明文密码向服务端传输。
在“security.js RSA 加密与java客户端解密”的场景中,JS(JavaScript)用于前端,处理用户登录时的密码加密,而Java则在后端负责解密工作,确保密码的安全传输。 首先,让我们详细了解RSA加密的基本原理。RSA是由...
在登录场景中,使用DES加密传输的目的在于防止中间人攻击,即使数据在传输过程中被截取,由于加密的存在,攻击者无法直接获取明文信息。然而,DES的56位密钥长度在今天看来已不再足够安全,因此通常会结合其他更强的...
总的来说,这个压缩包提供的解决方案可以帮助开发者在uniapp小程序中实现前后端AES加密解密,确保数据在传输过程中的安全性。这不仅适用于小程序,也可以应用于其他uniapp开发的H5、Android和iOS应用。通过合理使用...
在IT行业中,传输加解密是确保数据安全的重要环节,特别是在Web应用开发中。"RuoYi-Vue-Plus 4.x" 是一个基于Vue.js框架构建的管理后台系统,它显然关注了数据在传输过程中的安全性。在这个版本中,开发者可能已经...