我们平时做用户登录表单提交,用户名密码都是明文直接POST到后端,这样很容易被别人从监听到。

在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑~

项目在这里 https://github.com/travist/jsencrypt

关于jsencrypt和RSA我就不多介绍了,直接上代码

因为jsencrypt与最新的PHP不兼容所以折腾了好久,在js上做了些改动

可直接下载修改过的js:http://pan.baidu.com/s/1qYu0FA8

1,编辑jsencrypt.js,添加3个方法:

  1. function RSAEncryptLong(text) {
  2. var length = ((this.n.bitLength()+7)>>3) - 11;
  3. if (length <= 0) return false;
  4. var ret = "";
  5. var i = 0;
  6. while(i + length < text.length) {
  7. ret += this._short_encrypt(text.substring(i,i+length));
  8. i += length;
  9. }
  10. ret += this._short_encrypt(text.substring(i,text.length));
  11. return ret;
  12. }
  13.  
  14. /**
  15. * base64编码
  16. * @param {Object} str
  17. */
  18. function base64encode(str){
  19. var out, i, len;
  20. var c1, c2, c3;
  21. len = str.length;
  22. i = 0;
  23. out = "";
  24. while (i < len) {
  25. c1 = str.charCodeAt(i++) & 0xff;
  26. if (i == len) {
  27. out += base64EncodeChars.charAt(c1 >> 2);
  28. out += base64EncodeChars.charAt((c1 & 0x3) << 4);
  29. out += "==";
  30. break;
  31. }
  32. c2 = str.charCodeAt(i++);
  33. if (i == len) {
  34. out += base64EncodeChars.charAt(c1 >> 2);
  35. out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  36. out += base64EncodeChars.charAt((c2 & 0xF) << 2);
  37. out += "=";
  38. break;
  39. }
  40. c3 = str.charCodeAt(i++);
  41. out += base64EncodeChars.charAt(c1 >> 2);
  42. out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  43. out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  44. out += base64EncodeChars.charAt(c3 & 0x3F);
  45. }
  46. return out;
  47. }
  48.  
  49. /**
  50. * base64解码
  51. * @param {Object} str
  52. */
  53. function base64decode(str){
  54. var c1, c2, c3, c4;
  55. var i, len, out;
  56. len = str.length;
  57. i = 0;
  58. out = "";
  59. while (i < len) {
  60. /* c1 */
  61. do {
  62. c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
  63. }
  64. while (i < len && c1 == -1);
  65. if (c1 == -1)
  66. break;
  67. /* c2 */
  68. do {
  69. c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
  70. }
  71. while (i < len && c2 == -1);
  72. if (c2 == -1)
  73. break;
  74. out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
  75. /* c3 */
  76. do {
  77. c3 = str.charCodeAt(i++) & 0xff;
  78. if (c3 == 61)
  79. return out;
  80. c3 = base64DecodeChars[c3];
  81. }
  82. while (i < len && c3 == -1);
  83. if (c3 == -1)
  84. break;
  85. out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
  86. /* c4 */
  87. do {
  88. c4 = str.charCodeAt(i++) & 0xff;
  89. if (c4 == 61)
  90. return out;
  91. c4 = base64DecodeChars[c4];
  92. }
  93. while (i < len && c4 == -1);
  94. if (c4 == -1)
  95. break;
  96. out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
  97. }
  98. return out;
  99. }

2,找到这一行

  1. RSAKey.prototype.encrypt = RSAEncrypt;

修改为:

  1. RSAKey.prototype.encrypt = RSAEncryptLong;
  2. RSAKey.prototype._short_encrypt = RSAEncrypt;

3,找到这一行代码

  1. JSEncrypt.prototype.encrypt = function (string) {
  2. // Return the encrypted string.
  3. try {
  4. return hex2b64(this.getKey().encrypt(string));
  5. }

修改为:

  1. JSEncrypt.prototype.encrypt = function (string) {
  2. // Return the encrypted string.
  3. try {
  4. return base64encode(this.getKey().encrypt(string));
  5. }

4,页面js加密代码

  1. <script type="text/javascript" src="jsencrypt.js"></script>
  2. <script>
  3. function encrypt(msg) {
  4. var rsa = new JSEncrypt();
  5. rsa.setPublic('
  1. -----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6LHB0pVFfBSUkTtzQVXvX4ohF3M0jb/7JdTs3GJccf+VhYjIIdOmFFGrJFXAI459VbTuobG/yoCN5OOWs7NrCZvFQ3gS9u7RU2Mf7vK3So+hP56ijWMMzVkmBwyKF9U6NQ4Q4NhUMIpe/8HA87eps1n2emxEbxrNanvSQi3c1VwIDAQAB-----END PUBLIC KEY-----
  1. ', '10001');
    return rsa.encrypt(msg);
    }
    </script>

5,PHP解密代码

  1. require_once('Crypt/RSA.php');
  2. define("KEY_PRIVATE", "
  1. -----BEGIN RSA PRIVATE KEY-----
    MIICWwIBAAKBgQC6LHB0pVFfBSUkTtzQVXvX4ohF3M0jb/7JdTs3GJccf+VhYjII
    dOmFFGrJFXAI459VbTuobG/yoCN5OOWs7NrCZvFQ3gS9u7RU2Mf7vK3So+hP56ij
    WMMzVkmBwyKF9U6NQ4Q4NhUMIpe/8HA87eps1n2emxEbxrNanvSQi3c1VwIDAQAB
    AoGAR/EWP60Gha5qTN6Aq6zs3161hDGvv8rubRD1IfRJqISvsfMNHIF5H6jlHvE+
    yuCS2KMOU6YbmGlTa+uVrT4VxjKqDhvRoym4oOXdZURlr2hHsQjB5A20Ud6mh2dA
    TpbXodxBHz9xA/KJanesFUipQMftzfjezDCSOtM/DwiqZ+ECQQDltR45mSpmK9/k
    Izk76iQiQe3Elxvhu/FFo/g23fMk4dG2ZObUmTnGED81VOp8TqR9/WJ0NFHywoGy
    J/sdZdORAkEAz3uxMWWsG0ywSb6tRuxr1zVBRPkzH3v0tuNxFl09dKq2HS4U2uAD
    nXFnyseSpWEZB9asrH1+frYIFjxFSra2ZwJAL/kWeeMCFtp85NFyZ4/rwffQ52jD
    mu48YlXvRc4utHow6Q3Do4zoovPLr6CvZAysj992S1yN7Mwwd/uflzEn8QJADRtX
    OjOeB6t0h3QQJibROSsYEG9dl2ORNexwPGVveGtATd+XWaxFDjEXyWuKDAByQFiD
    V/Ilh4OgRydPiUS5iQJAdSjhqtN1kz5nyiP8tYbmwxhMojLl7qSNkYJEarhml6Wy
    gvInF7gsoOg/MUC8Ytgv+f93gi2aHGR/rn0ODRkqqg==
    -----END RSA PRIVATE KEY-----
  1. ");
  2.  
  3. function decrypt(msg) {
    $rsa = new Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $rsa->loadKey(KEY_PRIVATE, CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
    $s = new Math_BigInteger(base64_decode(msg), 16);
    retrun $rsa->decrypt($s->toBytes());
    }

在线生成RSA秘钥对:http://travistidwell.com/jsencrypt/demo/

最后 我希望这个解决方案能帮助你们中的一些人。如果我的文章有什么问题,请随时联系帮助我纠正它。

参考:

http://travistidwell.com/jsencrypt/

http://travistidwell.com/jsencrypt/demo/

http://bestmike007.com/2011/08/secure-data-transmission-between-pure-php-and-javascript-using-rsa/

JS到PHP使用RSA算法进行加密通讯的更多相关文章

  1. <密码学入门>关于RSA算法的加密解密及代码实现

    RSA算法 是一种公钥加密算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大.RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非 ...

  2. 使用PHP实现RSA算法的加密和解密

    本文提供使用RSA算法加密解密数据的PHP程序类(签名和验签的实现方式可以查看使用PHP实现RSA算法的签名和验签 这篇文章),封装了格式化公钥和私钥文件的方法,这样无论使用什么格式的公钥或者私钥都可 ...

  3. RSA算法小记

    学习来源:http://www.cnblogs.com/vamei/p/3480994.html 小记: 一.数学基础: 欧拉Phi函数:Φ(n)=总数(从1到n-1中与n互质的整数) (1)欧拉定理 ...

  4. 加密算法——RSA算法(c++简单实现)

    RSA算法原理转自:https://www.cnblogs.com/idreamo/p/9411265.html C++代码实现部分为本文新加 RSA算法简介 RSA是最流行的非对称加密算法之一.也被 ...

  5. RSA算法概述

    RSA算法的概述(个人理解,欢迎纠正) RSA是一种基于公钥密码体制的优秀加密算法,1978年由美国(MIT)的李维斯特(Rivest).沙米尔(Shamir).艾德曼(Adleman)提的.RSA算 ...

  6. springmvc使用RSA算法加密表单

    今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以 ...

  7. 基于私钥加密公钥解密的RSA算法C#实现

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  8. 浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥

    概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的.RSA就是取自他们三个人的名字. 算法基于一个数论:将两个大素数相乘很ea ...

  9. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

随机推荐

  1. 在iOS中怎样创建可展开的Table View?(上)

    原文地址 本文作者:gabriel theodoropoulos 原文:How To Create an Expandable Table View in iOS 原文链接 几乎所有的app都有一个共 ...

  2. open_table与opened_table --2

    好多人在调优Mysql的时候,总是对open_tables和opend_tables两个参数分别不清. 网上好多解释都是这样的:open_tables:当前打开表的数量opened_tables:当前 ...

  3. Linux lsof命令使用小结

        lsof(list open files)是一个列出当前系统打开文件的工具.在Linux环境下,任何事物都是以文件的形式存在,通过文件不仅可以访问常规数据,还可以访问网络连接和硬件.所以,如传 ...

  4. Folder and jar

  5. Bootstrap的Affix与ScrollSpy用法 bootstrap-scrollspy && bootstrap-dropdown

    bootstrap-scrollspy && bootstrap-dropdown Bootstrap的Affix与ScrollSpy用法 http://9iphp.com/web/j ...

  6. 控制器跳转:tabbarcontroller怎么写代码切换视图?

    项目中有时候需要在界面中进行跳转  常用的有push  present等方法  但想要在tabbarcontroller的某个子控制器跳转到另一个子控制器  怎么做? 只需要一行代码: 1是你需要跳转 ...

  7. logstash input jdbc连接数据库

    示例 以下配置能够实现从 SQL Server 数据库中查询数据,并增量式的把数据库记录导入到 ES 中. 1. 查询的 SQL 语句在 statement_filepath => " ...

  8. 关于Apache Commons-Lang的总结

    部分转载至:http://linhongyu.blog.51cto.com/6373370/1553329 一.前言 Java码农不识Apache,敲尽一生也枉然.旗下的开源项目众多,各个都是吊炸天. ...

  9. SharpDevelop 编译时,任务失败,因为未找到“resgen.exe”的解决方法

    在git clone sprite的项目,在本地编译的时候,会出现 任务失败,因为未找到“resgen.exe”,或未安装正确的 Microsoft Windows SDK.任务正在注册表项 HKEY ...

  10. php gd 生成日历图

    <?php //如果您提交了时间则显示您提交年月的日历,否则显示当前月份日历 if (isset($_GET['month']) && isset($_GET['year'])) ...