CryptoJS遇到的小坑


CryptoJs是前端加密用的,具體介紹:http://code.google.com/p/crypto-js/ 對應國內免費CDN 服務:http://www.bootcdn.cn/crypto-js/

我是工作上要爬蟲電信的信息,要先登錄呀,於是我查看了他的代碼

 1 <script type="text/javascript">
 2  $("#loginbtn").click(function() {
 3         var t = $("#txtAccount").val(),
 4         n = $("#hidUType").val(),
 5         i = $("#txtCityNo").val(),
 6         o = $("#txtShowPwd").attr("data-preval"),
 7         u = $("#txtPassword").val(),
 8         r = $("#txtCaptcha").val(),
 9         f,
10         e;
11         if (t == "" || t == txtAccount_Default && n != "204" || t == txtAccount_Default_YWMob && n == "204") return $("#txtAccount").focus(),
12         showErrMsg("請輸入用戶名"),
13         !1;
14         if (n != "201") if (n == "202" || n == "203") {
15             if (i == "" || i == txtCityNo_Default) return $("#txtCityNo").focus(),
16             showErrMsg("請輸入地市"),
17             !1;
18             if (i = $("#hidCityNo").val(), i == "") return $("#txtCityNo").focus(),
19             showErrMsg("請重新輸入地市"),
20             !1
21         } else if (n == "204") {
22             if (!checkIsCellphone(t)) return showErrMsg("請輸入正確的手機號碼"),
23             !1
24         } else if ($("#txtAccount").blur(), n = $("#hidUType").val(), n == "") return showErrMsg("請重新輸入登錄信息"),
25         !1;
26         if (u == "") return $("#txtShowPwd").focus(),
27         showErrMsg("請輸入" + o),
28         !1;
29         if (f = $("#hidRandomFlag").val(), e = ValidatePwd(n, t, u, f), e.Code != "0") return $("#txtShowPwd").focus(),
30         showErrMsg('密碼過於簡單,請通過“<a style="color: #ff8200" onclick="wjmmShow();">忘記密碼<\/a>”進行重置。'),
31         !1;
32         if (r == txtCaptcha_Default && (r = "", $("#txtCaptcha").val(r)), $("#liCaptcha").is(":visible") && r == "") return $("#txtCaptcha").focus(),
33         showErrMsg("請輸入" + txtCaptcha_Default),
34         !1;
35         reqInfo_Cookie_W();
36         $("#txtPassword").valAesEncryptSet();
37         $("#loginForm").submit()
38     });
39 
40 
41     $.fn.valAesEncryptSet = function() {
42     var i = this.val(),
43     n,
44     t;
45     try {
46         n = this.aesDecrypt(i);
47         n != "" && (t = this.aesEncrypt(n), t != i && (n = ""))
48     } catch(r) {
49         n = ""
50     }
51     return n == "" && (t = this.aesEncrypt(i)),
52     this.val(t),
53     this.val()
54 }
55 
56 $.fn.aesEncrypt = function(n) { 
57     var t = CryptoJS.MD5("login.189.cn"), 
58     i = CryptoJS.enc.Utf8.parse(t), 
59     r = CryptoJS.enc.Utf8.parse("1234567812345678"), //31323334353637383132333435363738
60     u = CryptoJS.AES.encrypt(n, i, {
61         iv: r
62     }); 
63     return u + ""
64 };
65 
66 
67 $.fn.aesDecrypt = function(n) {
68     var t = CryptoJS.MD5("login.189.cn"),  
69     i = CryptoJS.enc.Utf8.parse(t), 
70     r = CryptoJS.enc.Utf8.parse("1234567812345678"); 
71     return CryptoJS.AES.decrypt(n, i, {
72         iv: r
73     }).toString(CryptoJS.enc.Utf8) 
74 };
75 </script >

代碼看的少看不太懂呀,於是我就自己試了一下其實就是把代碼復制自己斷點運行看看。

<script type="text/javascript">    
    $.fn.valAesEncryptSet = function() {
        var i = "123",
        n,
        t;
        var hash = CryptoJS.MD5("Message");
        var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");

        var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
        try {
            n = this.aesDecrypt(i);
            n != "" && (t = this.aesEncrypt(n), t != i && (n = ""))
            var c = n != "";
            alert( c && (t = this.aesEncrypt(n), t != i && (n = "")));
        } catch(r) {
            n = ""
        }
        alert(n == "" && (t = this.aesEncrypt(i)),
                this.val(t),
                this.val());
        return n == "" && (t = this.aesEncrypt(i)),
        this.val(t),
        this.val()
    }
    //加密
    $.fn.aesEncrypt = function(n) { //U2FsdGVkX1+vmOX1CZKawT1bU4PKfohd/2EJZKD25l0=
        var t = CryptoJS.MD5("login.189.cn"), //33b21adee1b8620a7ba81aea1a80c724
        i = CryptoJS.enc.Utf8.parse(t), //3333623231616465653162383632306137626138316165613161383063373234
        r = CryptoJS.enc.Utf8.parse("1234567812345678"), //31323334353637383132333435363738
        u = CryptoJS.AES.encrypt(n, i, {
            iv: r
        }); //U2FsdGVkX1+vmOX1CZKawT1bU4PKfohd/2EJZKD25l0=
        return u + ""
    };
    //E+kuJYooy4s85LxPhwh5kw==
    
    //解密
    $.fn.aesDecrypt = function(n) {
        var t = CryptoJS.MD5("login.189.cn"),  //33b21adee1b8620a7ba81aea1a80c724 (傳入的字符串(還是原來字符串)進行md5)// 6c6f67696e2e3138392e636e(utf8轉碼獲取十六進制編碼)
        i = CryptoJS.enc.Utf8.parse(t), //3333623231616465653162383632306137626138316165613161383063373234 (utf8轉碼獲取十六進制編碼byte[])
        r = CryptoJS.enc.Utf8.parse("1234567812345678"); //31323334353637383132333435363738
        return CryptoJS.AES.decrypt(n, i, {
            iv: r
        }).toString(CryptoJS.enc.Utf8) 
    };
</script>
<!-- <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js"></script> -->
<!-- <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> -->
<script src="//cdn.bootcss.com/crypto-js/3.1.2/components/core.js"></script>
<script src="//cdn.bootcss.com/crypto-js/3.1.2/rollups/aes.js"></script>
<!-- <script src="//cdn.bootcss.com/crypto-js/3.1.2/components/aes.js"></script> -->
<script src="//cdn.bootcss.com/crypto-js/3.1.2/components/md5.js"></script>
<script src="//cdn.bootcss.com/crypto-js/3.1.2/components/enc-base64.js"></script>        

第一個坑(引用js錯誤)

首先core一定要引用的,其次是注意引用js是否正確這里我把aes引用錯了,(這兩個js都是存在的)

第二個坑(如何查看編碼后的字符串)

在你想要查看變量時候直接查看

最開始我是彈框看對應的值,但是這樣看着不太方便,后來我在看他的代碼發現竟然是這樣獲取的。

對於 加密的變量 直接在后面 +"" 即可查看到加密后字符串

字符串編碼后(Utf8.parse)文字要用查看( toString(CryptoJS.enc.Utf8) )

 

CtyptoJS下載

 后面java解析方法參考了http://www.cnblogs.com/molao-doing/articles/3972565.html

 另外如果你的key不是16,且遇到異常為java.security.InvalidKeyException: Illegal key size or default parameters

請參考這個替換jar,http://blog.csdn.net/l1028386804/article/details/42706039


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM