关于apicloud加密模块signature踩坑经历

2017-08-18 17:33:30

    两个小时的光阴,研究并使用signature模块。

    由于上来很顺利的把ios端和服务端的加密通信搞定了,可谓信心满满的去搞android端。但是,安卓端加密以后,服务端死活解不开,发给ios端也是解不开,心中顿时万马奔腾。

    赶紧翻了翻apicloud论坛,唉呀,并没有搜索到相关的问题,水贴一却是一大片。没办法,发贴官方求助吧,管理员一个小时后终于回复,说会上报给技术部门解决云云。


    毕竟用人家的东西,要怀感恩之心。论坛谢过以后,得找解决办法不是。rsa不行,要不咱换aes吧,换了以后,尼玛,ios也解不开了,彻底玩完。


    反正我是不打算用他的模块了,我决定引入外部js自己搞一个好了,去他奶奶的模块,爱谁谁用。来到我们最可爱的github,果然有相应解决方法,链接地址:https://github.com/travist/jsencrypt

    我们只需要把bin目录下的jsencrypt.min.js即可,啥也不说了,开始整合。


    首先放login.js文件内容

function setLeftTime() {    
        var second = Math.floor(leftsecond);
        $("#verify_code").html(second + "秒后可重发");
        $('#verify_code').removeClass('aui-btn-info');
        leftsecond--;
        if (leftsecond < 1) {
            clearInterval(timer);
            try {
                $("#verify_code").html("获取验证码");
                $('#verify_code').attr("onclick", 'sendMobileValidSMSCode()');
                $("#mobile").removeAttr("readonly");
    
            } catch (E) {
                console.log('error');
            }
            return;
        }
    }
    
    function sendMobileValidSMSCode() {
        var mobile = $('#mobile').val();
        var mbTest = /^(13|14|15|17|18)[0-9]{9}$/;
        if (mbTest.test(mobile)) {
            leftsecond = 60;
            timer = setInterval(setLeftTime, 1000);
            $("#mobile").attr("readonly", true);
            var postStr = {"phone":mobile};
            var encodeStr = rsaEncode(JSON.stringify(postStr));
            var url = serverUrl + "/api/qiuhan/getSmsCode";
            api.ajax({
                url: url,
                method: 'post',
                data: {
                    values: {
                        data: encodeStr,
                    },
                }
            },function(ret, err){
                if (ret) {
                    if(ret.status)
                    {
                      var decodeStr = JSON.parse(rsaDecode(ret.data));
                      if(decodeStr.status)
                      {
                        alert(decodeStr.message)
    
                      }else{
                        console.log('解密失败!');
                      }
                    }else{
                      console.log('返回失败!');
                    }
                } else {
                    console.log(JSON.stringify( err ));
                }
            });
    
    
    
        } else {
            api.toast({
                msg: '请输入正确的手机号码!',
                duration: 2000,
                location: 'bottom'
            });
    
        }
    }
    
    apiready = function() {
        api.parseTapmode();
        $('#verify_code').click(function() {
            sendMobileValidSMSCode();
        });
    };

    相应的rsa.js内容,很好,比原来精减多了。

        
        function rsaEncode(str) {
            var encrypt = new JSEncrypt();
            encrypt.setPublicKey(rsa_public);
            var result = {};
            return encrypt.encrypt(str);
    
    
        }
    
    
        function rsaDecode(str) {
            var decrypt = new JSEncrypt();
            decrypt.setPrivateKey(rsa_private);
            return decrypt.decrypt(str);
        }

    相关文件在login_frm.html中引入一下即可,测试一下,android和ios均通过。