我们平时做用户登录表单提交,用户名密码都是明文直接POST到后端,这样很容易被别人监听到(如一些收手机端端的流量监测app)。注:包括使用MD5等哈希函数处理后的数据,这里也算做明文(现在MD5爆破网站已经很多了~)。
对安全性要求较高的网站,比如银行和大型企业等都会使用HTTPS对其进行加密通讯。但是由于效率原因,使用HTTPS的代价是及其昂贵的,对于访问量稍大的网站就会造成严重的性能瓶颈。
解决方法一般只能采用专门的SSL硬件加速设备如F5的BIGIP等。所以很多网站选择了模拟SSL的做法,使用RSA来对密码等安全信息进行公钥加密,服务端用私钥解密。通常是对密码进行加密。
参考这篇文字,http://sunxboy.iteye.com/blog/209156,实现了登录密码rsa的加密。
实现方法:
1)服务端定时生成RSA密钥对(1台服务器负责生成供整个集群使用)
2)用户访问登录页时服务端返回公钥的exponent和module,rsa的js库要用到。
3)用户提交表单时,加密密码字段,提交表单,明文密码字段不传输
4)服务端获取私钥,解密加密后的密码
优化点:
1)密钥只在一定的时间内有效,如:一天更换一次密钥,但在密钥切换时还需保证上次的密钥的有效。通过增加时间戳参数可以实现。
2)把加密后的密码放在密码框,提交表单,而浏览器有个记住密码的功能,这样就把加密后的密码记住了,而加密后的数据不是每次都一样的,呵呵问题来了。我通过增加一个隐藏字段,把加密后的密码放在这个字段,然后通过js移除原有密码框的name属性,再提交表单,就巧妙的解决了这个问题。
3)原文有个解密方法,里面一行代码会造成内存泄露,属于用法错误
- Cipher cipher = Cipher.getInstance("RSA",
- new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher.getInstance()不要每次都用new的Provider对象,因为一次线上问题,查看源码发现泄露的根源:
再看SunJCE_b.a(),
SunJCE_b中的f、e分别是
private static final Map e = new IdentityHashMap(); private static final Map f = new IdentityHashMap();
f最后移除了provider,但e一直在增加provider,provider作为IdentityHashMap的key,每次new时都不一样,然后。。就没有然后了。
IdentityHashMap:This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).)
This class is not a general-purpose Map implementation! While this class implements the Map interface, it intentionally violates Map's general contract, which mandates the use of the equals method when comparing objects. This class is designed for use only in the rare cases wherein reference-equality semantics are required.
4)将加密后的16进制字符串转成字节数组方法不对:
byte[] enResult = new BigInteger(enc, 16).toByteArray();
应该这样
public static byte[] hexStringToBytes(String hexString) { if (hexString == null || hexString.equals("")) { return null; } hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } /** * Convert char to byte * @param c char * @return byte */ private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); }
参考http://blog.csdn.net/lich0000/article/details/8629018,否则遇到某些字符串无法正确解密
5)客户端js加密方法:
setMaxDigits(130); var key = new RSAKeyPair(exponent,"",publicModule); var encPass = encryptedString(key,pass)
6)最后还遇到一个问题,更新了线上的js后,js后最好跟一个时间戳,这样不需要用户手动清空缓存。另外手动打开chrome浏览器,自动化脚本打开chrome浏览器访问的js缓存是不同的,手动提交表单正常,自动化脚本提交表单还用的是老的js,好像是浏览器的不同实例引起的,具体是啥策略一时没闹明白???
相关推荐
RSA加密算法是公钥密码学中的一个重要组成部分,它在信息安全领域有着广泛的应用,例如数字签名、数据加密等。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的库支持来创建桌面和移动应用。在本...
本示例旨在提供一个使用RSA加密实现安全登录的教程。以下将详细阐述RSA加密的基本原理、登录过程以及如何在项目中集成和使用。 **RSA算法概述** RSA(Rivest-Shamir-Adleman)是由Ron Rivest、Adi Shamir和Leonard...
9. **应用场景**:RSA加密解密工具常用于网络通信中的数据保护、软件激活、数字证书、电子邮件安全等领域,确保信息在传输过程中不被窃取或篡改。 总之,通过使用这个RSA加密解密工具并遵循操作指南,用户可以有效...
RSA加密是一种非对称加密算法,它在网络安全中扮演着重要的角色,特别是在用户登录认证过程中。Java作为一种广泛使用的编程语言,提供了丰富的库支持RSA加密。本文将深入探讨如何使用Java实现RSA加密登录。 首先,...
但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。 RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密...
**C# RSA加密解密详解** 在信息安全领域,加密技术是一种至关重要的手段,用于保护数据的隐私和安全性。RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛应用于网络通信、数据存储等领域。C#作为.NET...
此外,为了安全起见,通常会结合其他加密方式(如对称加密)使用,比如用RSA加密对称密钥,然后用对称密钥加密大量数据,以兼顾安全性和效率。 总之,通过VB实现RSA加密算法,不仅能够加深对加密原理的理解,还能够...
RSA加密算法是基于大数分解问题的安全性,公钥和私钥都是两个大素数的函数。公钥对的产生包括选择两个大素数p和q,计算n=p*q,然后随机选择加密密钥e,要求e和(p-1)*(q-1)互质。最后,利用Euclid算法计算解密密钥d,...
RSA加密算法是信息安全领域的重要组成部分,其基于数学原理的非对称加密方式为数据传输和网络安全提供了坚实的保障。尽管该算法在信息安全领域应用广泛,但对于初学者而言,复杂的代码和抽象的数学概念往往构成理解...
本资源提供了RSA加密解密的源码,适用于学习和理解RSA算法的工作原理及其实现。 首先,RSA算法的核心原理基于大数的因式分解困难性。它由三位科学家Rivest、Shamir和Adleman于1977年提出,因此得名RSA。该算法包括...
RSA加密是一种非对称加密算法,它基于两个不同的密钥:公钥和私钥。在Java和JavaScript中实现RSA加密,对于处理较长的数据至关重要,因为这两种语言的标准库默认的RSA加密只能处理相对较小的块。这里我们将深入探讨...
本文将深入探讨RSA加密和解密的基础知识以及如何在Unity中实现这一功能。 首先,RSA加密的核心原理是基于大整数因子分解的困难性。它生成一对密钥:公钥和私钥。公钥可以公开,用于加密;而私钥必须保密,用于解密...
总的来说,这个C#源码提供了一个实用的工具,用于安全地模拟登录百度账号,并且展示了如何在C#中集成Rsa加密技术。对于学习C#编程和网络安全的开发者来说,这是一个有价值的参考资料,有助于理解和实践非对称加密...
对于大文件,通常先使用对称加密算法(如AES)加密,然后用RSA加密对称密钥,这样既兼顾了效率又保证了安全。 8. **其他相关概念**:除了RSA,还有其他非对称加密算法,如ECC(椭圆曲线加密)、DSA(数字签名算法)...
RSA加密算法是一种非对称加密技术,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是现代密码学的基石之一。在PowerBuilder(PB)开发环境中,使用RSA算法可以实现数据的安全传输和存储。PB12.5是Power...
总之,这个项目展示了如何在Java后端和JavaScript前端之间使用RSA加密技术进行安全的数据交换,保护敏感信息,尤其适用于处理用户登录等涉及用户隐私的操作。通过深入理解RSA算法和相关的编程库,开发者可以构建更...
在Postman中使用Forge.js进行RSA加密可以帮助开发人员在API测试时模拟安全的数据交互。 首先,RSA是一种非对称加密算法,它基于两个密钥:公钥和私钥。公钥可以公开,用于加密数据,而私钥必须保密,用于解密数据。...
在这个"C# RSA加密DEMO"中,我们主要关注如何在C#环境中使用RSA加密。首先,我们需要理解RSA的基本工作原理。RSA基于大数因子分解的困难性,即找到两个大素数的乘积相当容易,但反过来分解一个大合数成其素因数却...