(转)博客园登陆__JSEncrypt 分析

下面就是从博客园登录页面copy下来的js登录代码片段

博客园登录时采用的ajax发信http登录请求,就是采用jsencypt加密,以保护用户登录账号安全,一下是js片段代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

var return_url = http://home.cnblogs.com/u/wxb0328/;

       var ajax_url = ‘/user‘ + ‘/signin‘;

       var enable_captcha = false;

       var is_in_progress = false;

       function setFocus() {

           document.getElementById(‘input1‘).focus();

       }

       function check_enter(event) {

           if (event.keyCode == 13) {

               var target = event.target || event.srcElement;

               if (target.id == "input1") {

                   if (document.getElementById(‘input1‘).value == ‘‘) {

                       $(‘#tip_input1‘).html("请输入登录用户名");

                       return;

                   }

                   else if (document.getElementById(‘input2‘).value == ‘‘) {

                       document.getElementById("input2").focus();

                       return;

                   }

               }

               if (target.id == "input2") {

                   if (document.getElementById(‘input2‘).value == ‘‘) {

                       $(‘#tip_input2‘).html("请输入密码");

                       return;

                   }

               }

               signin_go();

           }

       }

       function signin_go() {

           if(is_in_progress){

               return;

           }

           $(‘#tip_input1‘).html(‘‘);

           $(‘#tip_input2‘).html(‘‘);

           var input1 = $.trim($(‘#input1‘).val());

           if (!input1) {

               $(‘#tip_input1‘).html("请输入登录用户名");

               $(‘#input1‘).focus();

               return;

           }

           var input2 = $.trim($(‘#input2‘).val());

           if (!input2) {

               $(‘#tip_input2‘).html("请输入密码");

               $(‘#input2‘).focus();

               return;

           }

           if(enable_captcha)

           {

               var captchaCode = $.trim($(‘#captcha_code_input‘).val());

               if (!captchaCode)

               {

                   $(‘#tip_captcha_code_input‘).html("请输入验证码");

                   $(‘#captcha_code_input‘).focus();

                   return;

               }

           }

           $(‘#tip_btn‘).html(‘提交中...‘);

           var encrypt = new JSEncrypt();

           encrypt.setPublicKey(‘MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknrScAKC0XhadTHT3Al0QIDAQAB‘);

           var encrypted_input1 = encrypt.encrypt($(‘#input1‘).val());

           var encrypted_input2 = encrypt.encrypt($(‘#input2‘).val());

           var ajax_data = {

               input1: encrypted_input1,

               input2: encrypted_input2,

               remember: $(‘#remember_me‘).prop(‘checked‘)

           };

           if(enable_captcha){

               var captchaObj = $("#captcha_code_input").get(0).Captcha;

               ajax_data.captchaId = captchaObj.Id;

               ajax_data.captchaInstanceId = captchaObj.InstanceId;

               ajax_data.captchaUserInput = $("#captcha_code_input").val();

           }

           is_in_progress = true;

           $.ajax({

               url: ajax_url,

               type: ‘post‘,

               data: JSON.stringify(ajax_data),

               contentType: ‘application/json; charset=utf-8‘,

               dataType: ‘json‘,

               headers: {

                   ‘VerificationToken‘: ‘v8o6Zbt1bkghAprMyn-NuKazyejPBAjz21CtWG81iKijaJ5u4u37q22GSdkbB9aqIc9deUoBETwjJxGFh0jLPZTSnXc1:EnF2TIFu9G2Kd0NgQuSFsXzcWtXcEj7AdxylV6Rlt7k5rcmZOu3j9bcoPO1kiBKGjg1V0WFB9dj8rWXIW34di1ONV6c1‘

               },

               success: function (data) {                   

                   if (data.success) {

                       $(‘#tip_btn‘).html(‘登录成功,正在重定向...‘);

                       location.href = return_url;

                   } else {

                       $(‘#tip_btn‘).html(data.message + "<br/><br/>联系 [email protected]");

                       is_in_progress = false;

                       if(enable_captcha)

                       {

                           captchaObj.ReloadImage();

                       }

                   }

               },

               error: function (xhr) {

                   is_in_progress = false;

                   $(‘#tip_btn‘).html(‘抱歉!出错!联系 [email protected]‘);

               }

           });

       }

       $(function () {

           $(‘#signin‘).bind(‘click‘, function () {

               signin_go();

           }).val(‘登 录‘);

       });

可以看到博客园使用了一个js加密类库:jsencrypt,下面就来了解一下这个类库!

js的一个使用OpenSSL加密,解密,秘钥生成类库     

A Javascript library to perform OpenSSL RSA Encryption, Decryption, and Key Generation

这里不对jsencrypt这个js类库做详细的介绍了,大家有兴趣可以去它的github主页学习,其实这个类库还是相对比较简单的,只要稍微看看就应该可以掌握。

[github主页](https://github.com/travist/jsencrypt  )

[官方网站](http://travistidwell.com/jsencrypt/  )

PHP关于OpenSSL相关资料

[PHP手册OpenSSL](http://php.net/manual/zh/book.openssl.php  )

关于后台PHP解密  

1. 学习PHP手册:[PHP手册OpenSSL](http://php.net/manual/zh/book.openssl.php  )

2. 参考博客:[php rsa加密解密实例](http://blog.csdn.net/clh604/article/details/20224735  )

下面贴出我自己写的测试demo

test.html


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

<!doctype html>

<html>

  <head>

    <title>JavaScript RSA Encryption</title>

    <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>

    <script src="./jsencrypt.min.js"></script>

    <script type="text/javascript">

// 使用jsencrypt类库加密js方法,

function encryptRequest(reqUrl, data, publicKey){

    var encrypt = new JSEncrypt();

    encrypt.setPublicKey(publicKey);

    // ajax请求发送的数据对象

    var sendData = new Object();

    // 将data数组赋给ajax对象

    for(var key in data){

        sendData[key] = encrypt.encrypt(data[key]);

    }

      $.ajax({

            url: reqUrl,

            type: ‘post‘,

            data: sendData,

            dataType: ‘json‘,

            success: function (data) {                   

                console.info(data);

            },

            error: function (xhr) {

                console.error(‘出错了‘);

            }

        });

}

      // Call this code when the page is done loading.

      $(function() {

        $(‘#testme‘).click(function() {

            

            var data = [];

            data[‘username‘]= $(‘#username‘).val();

            data[‘passwd‘]= $(‘#passwd‘).val();

            var pkey = $(‘#pubkey‘).val();

            encryptRequest(‘./test.php‘, data, pkey);

        });

      });

    </script>

  </head>

  <body>

    <label for="pubkey">Public Key</label><br/>

    <textarea id="pubkey" rows="15" cols="65">-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCBWNoG5LJ3u44Gs8PWs1MaNUQQ

+mOmh+9zWdzSt3ORbmfCDvU+ssW/6QTTgXvWWx7+Wzq/a4fCCQp72zSqXeVhWkTV

ct9Hyp/iMo5K6qOEK76z9z+tP/u99X6qazeXGVMWKkPiyZT4mKAGd/U8Mph9Z1Z5

kOluA7g7heq8PPlE9wIDAQAB

-----END PUBLIC KEY-----</textarea><br/>

    <label for="input">Text to encrypt:</label><br/>

    name:<input id="username" name="username" type="text"></input><br/>

    password:<input id="passwd" name="passwd" type="password"></input><br/>

    <input id="testme" type="button" value="submit" /><br/>

  </body>

</html>

test.php


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<?php

    

// 接收客户端发送过来的经过加密的登录信息

$input = $_POST;

// 私钥是放在服务器端的,用以验证和解密客户端经过公钥加密后的信息

$private_key = ‘-----BEGIN RSA PRIVATE KEY-----

MIICXAIBAAKBgQCBWNoG5LJ3u44Gs8PWs1MaNUQQ+mOmh+9zWdzSt3ORbmfCDvU+

ssW/6QTTgXvWWx7+Wzq/a4fCCQp72zSqXeVhWkTVct9Hyp/iMo5K6qOEK76z9z+t

P/u99X6qazeXGVMWKkPiyZT4mKAGd/U8Mph9Z1Z5kOluA7g7heq8PPlE9wIDAQAB

AoGABPQwNX9gznEieWM9JuXrUt+jYbsVQfWG2DYi3Pclt/YwhyAniGU0aas1Ahy9

b3JB95/q2hX2Nxo9iozUsYmzFT99dm2HBsHDnpnUgpyDtGo9sXlhLktyey53UKRx

QJkW5dWWUQfssNrCe08N3vtLiDIy04lRQ8F0eJ/iklzk1HECQQC22pOz7V2K5/50

w9LA9UBSl7wWhTTY5G1gsBEm5tNmbM/ZqCJ1FXB4uuDgz0o0N0x8T8JkkPrRWH5q

GIHFRswVAkEAtRbV8PoLnyT73hxtCw0F17aaI8W5AGhvsbjdA6nMo6byBR5xKN+7

lalfXYEfXPnStHVNSnQVFjN3T06iJV6z2wJBAKj51rLYcLBT8XbQG+vK+FUa+WrK

UGr6tQU7z63mc4dcmLtoP+d5F4XKFNRLWyRj0d+zCU5MGCzrnW7IFOxMn30CQEtv

4N3K/C5mtLmZM9+npChxfBKs2l2OJAFwFjnhcUs3T5jMTq2NTlKRRRXppUwREjJ0

ryb15pbiB7C0/Bz/L4MCQC1AOKKjnqQEpINatjZLkyay0bXBih9GXovz3T1eAxaS

QOEzIC+hGjX+2x1z5jUwwKCgjVUaZdrx470SMJM2Js8=

-----END RSA PRIVATE KEY-----‘;

// 公钥一般存放在登录页面中的一个隐藏域中,但是请注意:公钥和私钥一定要配对,且必须保证私钥的安全

$public_key = ‘-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCBWNoG5LJ3u44Gs8PWs1MaNUQQ

+mOmh+9zWdzSt3ORbmfCDvU+ssW/6QTTgXvWWx7+Wzq/a4fCCQp72zSqXeVhWkTV

ct9Hyp/iMo5K6qOEK76z9z+tP/u99X6qazeXGVMWKkPiyZT4mKAGd/U8Mph9Z1Z5

kOluA7g7heq8PPlE9wIDAQAB

-----END PUBLIC KEY-----‘;

/**

 * 使用PHP OpenSSL时,最好先看看手册,了解如何开启OpenSSL 和 其中的一些方法的使用

 *  具体如何使用这里不做赘述,大家去看看PHP手册,什么都就解决了

 */

$pi_key =  openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id 

$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的 

$decrypted = ""

openssl_private_decrypt(base64_decode($input[‘username‘]),$decrypted,$pi_key);//私钥解密 

// 这里的这个 $decrypted就是解密客户端发送过来的用户名,至于后续连接数据库验证登录信息的代码,这里也就省略了

echo json_encode($decrypted);

效果

总结

使用OpenSSL的方式加密可以达到比较安全的级别,在平时项目中非常有用!在以后工作中可以多多学习、使用、积累经验。

转自:http://www.cnblogs.com/wxb0328/p/4641820.html?utm_source=tuicool&utm_medium=referral

时间: 2024-08-25 22:41:44

(转)博客园登陆__JSEncrypt 分析的相关文章

利用装饰器模拟博客园登陆

import os # 登录状态 status_dic = { 'username': None, 'status': False } flag = True # 用户名,密码 以字典形式打开 def user_pwd(): with open("user", encoding="utf-8") as f: dic = {} for i in f: li = i.strip().split("|") dic[li[0].strip()] = li

博客园的模拟登陆(Simulated Login)

查看正常情况下登录博客园时本地浏览器向博客园的服务器发送的数据 依据上一步得到的由本地浏览器发送给博客园服务器的数据包内容进行模拟登陆 scrapy模拟登陆博客园 Reference 1.查看正常情况下登录博客园时本地浏览器向博客园的服务器发送的数据 首先打开博客园登录界面,填入登录用户名和密码,按快捷键 Ctrl+Alt+I 打开开发者管理器,然后点击登录 按钮,则可以在开发者管理器里看到发送的数据包内容. 数据包内容的查看位置如下图所示. 下面贴出了该数据包的内容 1. General 1.

使用C#发送Http 请求实现模拟登陆(以博客园为例)

原文:使用C#发送Http 请求实现模拟登陆(以博客园为例) 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到cookie即可实现模拟登陆,比如一些抢票软件的原理无非也是这样模拟客户端的cookie 然后发送请求去抢票,然后12306 本文将演示如何用C# 来实现模拟登陆的,推荐一款工具Fiddler,这是一款监听http 请求的利器.废话不多说,我就以博客园为例来实现模拟登陆.首先我登陆博客园 http://passport.cnblogs.com/login.

python+scrapy分析博客园首页4000篇优质博客(图解)

1.侵删 本文数据是获取的博客园首页的4000条数据,为了不对博客园服务器造成压力,所以源码不会公开,在此,敬请博客园官方团队放心. 获取到的数据从2019-7-11到2019-9-12,此数据也不会公开. 由于会涉及到一些博主的数据,所以有博主不愿公开数据,联系我及时删除. 2.先上数据分析结果 写文最多的博主top6 ---->(最勤劳的博主)?(′?`*) 黑白影-->发文54篇 周国通-->发文38篇 宜信技术-->发文30篇 削微寒-->发文28篇 泰斗贤若如--&

对博客园和CSDN的简要分析

一:主页面:                1.最左边的索引栏:两个网站都给出了索引的种类,但是博客园的索引栏提供了每一个分类的数量.CSDN只提供了相应的索引种类.在鼠标向下滑动时,csdn的索引会随着光标跟着向下滑动,它们的最左边分类只设计了类别(这点csdn胜),而博客园的最左边淡紫色列比较宽(除了分类功能,还提供了其他的功能,如下图),博客园的整体布局占据了整个页面,csdn则左右均有空出. 2.再观察上面的按钮建:博客园分区比较明显猪功能键也比较多,给人感觉比较直观:csdn则没有那么

在Python中用Request库模拟登录(二):博客园(简单加密,无验证码)

源代码分析 博客园的登录页面非常简单,查看网页源代码,可以发现两个输入框的id分别为input1.input2,复选框的id为remember_me,登录按钮的id为signin. 还有一段JavaScript代码,下面来简单分析一下. 先来看$(function(){});函数: 1 $(function () { 2 $('#signin').bind('click', function () { 3 signin_go(); 4 }).val('登 录'); 5 }); $(functio

python爬虫:两种方法模拟登录博客园

第一方法用第三方库(requests):参考http://www.mamicode.com/info-detail-1839685.html 源代码分析 博客园的登录页面非常简单,查看网页源代码,可以发现两个输入框的id分别为input1.input2,复选框的id为remember_me,登录按钮的id为signin. 还有一段JavaScript代码,下面来简单分析一下. 先来看$(function(){});函数: 1 $(function () { 2 $('#signin').bind

博客园客户端(Universal App)开发随笔 – App也需要物流前的打包

想起来一个笑话:唐僧一行千辛万苦来到佛祖面前,准备取经,佛祖轻声问了一句:汝等带U盘了吗?师徒4人立刻昏倒在地.好吧,扯远了,不过是想告诉大家准备工作一定要到位. Universal App 的打包发布其实与传统的 Windows Phone / Windows Store App 项目并无太大不同,但是鉴于总有人会在这些步骤中遇到问题,而且即使是发布过几个应用的开发者也不例外,所以对这个看起来比较繁琐的过程做一个小结还是必要的. 打包前的准备工作 1. 修改编译模式 在调试程序时,我们通常会选

个人技术博客的选择:CSDN、博客园、简书、知乎专栏还是Github Page?(转)

个人技术博客的选择:CSDN.博客园.简书.知乎专栏还是Github Page? 有很多技术人员在学习到一定程度后发现了写博客的重要性,一方面帮助自己记忆,一方面也能帮助他人解决问题,于是会选择自己开始写博客,之后又发现平台太多不知从何下手,在这里我根据自己写博客的经验比较一下各个平台的优缺点. 这里主要对比CSDN.博客园.简书.知乎专栏.Github Page.个人建站和其他 CSDN 笔者是CSDN的长期用户,也见到了很多不错的CSDN博客 优点 SEO做得好,无论是百度还是google(