- _nosay
关于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均通过。