以下是我在开发公司产品的时候遇到的问题,写下来备忘,有时间再整理格式;
加密和签名
我们的app和服务器有什么安全隐患?
1)窃听;如果你连接了不安全的免费wifi,然后登录我们的app,
如果你的数据没有加密,你的密码是不是就可能被盗?
2)篡改;万一黑客截获了app给服务器发送的请求数据,然后
稍作修改,发送给服务器,实现修改服务器数据的目的;
3)重放;万一黑客截获了app给服务器发送的请求数据,(哪怕是
加密过的),然后冒充app向服务器发送重复的请求,服务器
会不会被堵死?
4)如果黑客反编译app,修改逻辑(比如放松一些前端的检查规则),
重新打包运行(运行在黑客自己的手机上,不需要重新签名),
由于没有动加密和签名机制,所以在server看来,请求完全来自
可信的app,咋办?
怎么解决?
针对问题1,我们的网络通信数据需要加密,这样黑客
就看不到真实数据了;
针对问题2,我们需要给数据加签名,如果黑客截获并
修改了数据,则服务器会发现解密后的数据和
原数据不匹配,知道这是一份被修改过的数据,拒绝处理;
针对问题3,据文献,https能防止重放攻击,但是我还没搞懂原理,TODO
针对问题4:所以说只在前端加限制是不够的,后端必须再做一次
检查,这样就没事了;
问题:我们现有的加密机制有什么问题?
答:我们现在用的是AES对称加密,黑客可以反编译代码,
看到算法和密钥,然后截获并破解密文;
问题:我们现有的签名机制有什么问题?
答:我们现在用的是MD5+密钥的算法,黑客可以反编译app获取算法
和密钥,然后冒充app发起请求;
问题:RSA密钥生成算法是怎样的?
答:
1)随机选取2个足够大的不同素数p和q;
(最好保证下文的n是1024位二进制长度)
2)计算p和q的乘积n;
3)计算n的欧拉函数r = (p-1)*(q-1);
4)随机取一个整数e,要求1 < e < r,且e与r互质;
5)计算e对于n的模反元素d;
6)将(n,e)作为公钥,(n,d)作为私钥;(其实可以互换);
7)假设原数据是一个整数m,则加密结果为c=m^e%n;
8)解密过程是c^d%n,可以证明这个结果等于原数据m;
对于任意需要加密的字符串abc,我们可以将每个字母
分开,然后每个字母转成ASCII码