zoukankan      html  css  js  c++  java
  • 博客园登录机制

    博客园的登录机制是非常安全的。

    登录链接为:https://passport.cnblogs.com/user/signin
    该页上主要的js为 <script src="/scripts/signin_bundle.js?v=6bCaxODGR5KIkQhpigY5PlgW0FSYoJikUQ5l4hNlWIc1"></script>
    主要函数为

    function signinGo() {
        var r, u, f, e, n, i;
        if (!is_in_progress) {
            if ($("#tip_input1").html(""), $("#tip_input2").html(""), r = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKJPFz0k33Xq4fCKDNQpn/ttUhLLmajOKBhVe0idsvk3rrNN6N5ESosOpd+jZ+8DQrwGQKGbDd8is5qBi5egRa6fJvTxIxj55ZkuhUmcSHMJd9CpDQhZ/9Vmh8N3/lHailfoWZTwD9SDsVqlLrqnmHBKqbzJ7q5mR09LgciUkgkwIDAQAB", u = $.trim($("#input1").val()), !u) {
                $("#tip_input1").html("请输入登录用户名");
                $("#input1").focus();
                return
            }
            if (f = $.trim($("#input2").val()), !f) {
                $("#tip_input2").html("请输入密码");
                $("#input2").focus();
                return
            }
            if (enable_captcha && (e = $.trim($("#captcha_code_input").val()), !e)) {
                $("#tip_captcha_code_input").html("请输入验证码");
                $("#captcha_code_input").focus();
                return
            }
            $("#tip_btn").html("提交中...");
            n = new JSEncrypt;
            n.setPublicKey(r); 
            var o = n.encrypt($("#input1").val())
            var s = n.encrypt($("#input2").val())
            var t = {
                input1: o,
                input2: s,
                remember: $("#remember_me").prop("checked"),
                geetest_challenge: $("[name='geetest_challenge']").val(),
                geetest_validate: $("[name='geetest_validate']").val(),
                geetest_seccode: $("[name='geetest_seccode']").val()
            };
            enable_captcha && (i = $("#captcha_code_input").get(0).Captcha, t.captchaId = i.Id, t.captchaInstanceId = i.InstanceId, t.captchaUserInput = $("#captcha_code_input").val());
            is_in_progress = !0;
            $.ajax({
                url: ajax_url,
                type: "post",
                data: JSON.stringify(t),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                headers: {VerificationToken: "@TokenHeaderValue()"},
                success: function (n) {
                    n.success ? ($("#tip_btn").html("登录成功,正在重定向..."), location.href = return_url) : ($("#tip_btn").html(n.message + "<br/><br/>联系 contact@cnblogs.com"), is_in_progress = !1, enable_captcha && i.ReloadImage())
                },
                error: function () {
                    is_in_progress = !1;
                    $("#tip_btn").html("抱歉!出错!联系 contact@cnblogs.com")
                }
            })
        }
    }
    

    其中用到了JSEncrypt这个库,博客园使用了其中的RSA加密。
    RSA有两种使用方式:

    • 公钥加密、私钥解密:只有接受者(拥有私钥)才能读懂发送者(拥有公钥)加密后的密文。
      博客园采用的就是这种方式,在上面代码中,可以看见RSA的公钥,这个公钥是定期更新的。
    • 私钥加密、公钥解密:用于验证发布者,如果没有私钥,你就无法写出一封可以被公钥解密的文章来。拥有私钥,就相当于官方,就可以发布密文。别人没法冒充官方发布密文,因为它们发布的密文经过公钥解密就会变成无意义的乱码。

    加密的目的是不让窃听者看到明确的用户名和密码。但是,如果单纯地使用RSA加密,加密之后的用户名和密码是固定的(因为RSA算法是确定的),如果窃听者得到了加密后的用户名和密码,那跟获得了明文没什么区别(除非更改公钥)。

    为了掩人耳目,JSEncrypt的加密会给明文拼接上一个随机串,解密后只取有意义的串即可。这样其实还是无法避免上面提到的那种问题。

    除了加密,博客园也有验证码机制。平时登录,我们看不见验证码,因为登录次数不太频繁,一旦登录次数频繁了,博客园就会提示输验证码了。

    当登陆成功之后,就会获得若干Cookie,这些Cookie十分重要。Cookie如果泄露了,跟临时泄露密码没什么分别。如果你的Cookie都被人随意获取了,那你还有什么安全性可言?使用HTTPS能够更加安全,因为它对Cookie也是加密的,普通的HTTP有可能会泄露登录之后的cookie,那样同样是十分危险的。

    用户名、密码如果泄露,除非我赶在敌手之前,赶紧修改用户名密码才能免受攻击。
    公钥加密后的用户名、密码若泄露,有两种方式免受攻击:

    • 我修改用户名密码
    • 博客园公钥变了

    我的登录Cookie若泄露,那就十分头疼。因为博客园是允许多地登录的,如果是单端登录(像手机微信、手机支付宝那样),一方登陆之后另一方会退出。拥有一个登录的Cookie,就拥有一切。只能等到这个Cookie失效才可以。也许更改用户名密码之后,博客园后端会自动清空登录cookie列表。

    相关资料

    博客园加密登录--jsencrypt
    simplify the life

  • 相关阅读:
    软工实践个人总结
    第03组 每周小结 (3/3)
    第03组 每周小结 (2/3)
    第03组 每周小结(1/3)
    第03组 Beta冲刺 总结
    第03组 Beta冲刺 (5/5)
    第03组 Beta冲刺 (4/5)
    第03组 Beta冲刺 (3/5)
    第03组 Beta冲刺 (2/5)
    第03组 Beta冲刺 (1/5)
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/7675781.html
Copyright © 2011-2022 走看看