android 开发之安全问题

     

         在安卓开发中,安全是很重要的。那么怎么确定是不是安全问题呢?那么得从黑客的角度去想,只要黑客能够从app中找到一些方法获取我们的源码根据某些明显的字段得到重要信息从而修改程序以达到一定目的;窃取用户信息;窃取本地重要信息间接可以修改用户信息的。都是安全问题。

       那么安全问题,就可以得出来了。一般来说对于安卓开发,安全有两种,一种是数据通信安全,一种是本地app程序安全。

     数据通信安全

           数据通信又有app与服务器通信和本地之间通信。那么,来说说这两种方式吧。

           一、app与服务器通信安全。

               1)  谈到在与服务器进行数据交互,肯定想到加密。加密方式也有好多种。对称加密、非对称加密,不可逆加密。那么在与服务器交互中,保证数据安全,可以选择对称加密。对称加密选择AES加密方式。服务器和客户端约定同一个密钥,客户端用密钥对要发送的数据本身进行加密,传送到服务器,服务器获取加密过的信息,再用密钥进行解密。对于AES,就不介绍那么多了。AES主要是用在数据本身的加密,数据在网络传输中。即使被截取了,也是加密过后的数据。同时AES的弊端的是,客户端加密的话,密钥肯定是存在app中,如果app被成功破解了,被黑客拿到密钥。那么数据就被暴露了。如果app本身程序的安全也解决了,那么这样的app才算相对安全。

                 2)这里再说说非对称加密,非对称加密最普遍的就是RSA加密。非对称加密,加密使用的密钥和解密使用的密钥不是同一个密钥。加密使用的密钥被称为公钥,解密使用密钥被称为私钥。通常来说,由服务端提供公钥给客户端,由客户端进行加密,传送数据到服务器,服务器用私钥进行解密。这样的话,无论黑客是截取了网络信息,还是拿到破解了apk拿到公钥。都不能使数据进行明文展示。但是RSA并不能像AES那样对所有要和服务器交互的数据进行加密。因为RSA加密有个长度限制,这就导致了RSA加密不能用于所有的数据交互。但是可以用到一些短数据,比如用户个人信息之类的,在交易中,一次订单的数据也不是很大等。其中大家最熟悉的就是支付上对于RSA的应用。

                  3)其中还有一个不可逆加密,比如MD5加密、SHA加密等。所谓的不可逆加密就是,只能单向加密,不能反向解密。MD5把数据加密,最后得到固定长度的16进制编码。这个加密的作用一般是匹配验证,验证某个数据是否改变。比如密码,在向服务器存储密码,一般不会存储明文密码。安卓本地存储个标志也一般不会明文存储。

                

                  4)上面的都是对数据进行加密的,在通信上,有时并不一定对数据本身进行加密。比如可以使用令牌的方式,具体做法是:用户登录成功后,服务器生成一个访问令牌给客户端,此服务器设置令牌的有效期。客户端的所有请求都携带这个令牌去请求数据。当令牌时效的时候,客户端用户所有请求都请求不到,客户端用户退出登录状态。令牌时效都是由服务器来判断,时效的方式:1、令牌过期。这个一般是用户长期不登录,服务器设置的过期时间已经到了。2、令牌错误,一搬是黑客拿未知令牌恶意请求数据3、令牌更换,一般是客户端在另一台设备上登录重新获取了最新令牌。另外,令牌也可以使用户不用再次输入密码再次登录。

                   5)再者安全方式,请求数据使用https进行请求。大家都知道,https请求是需要证书认证的,并且半路截取的信息又是经过加密的。这又是怎么回事呢?其实https的证书就是非对称加密中的公钥 私钥。信息传输是经过对称加密对数据内容加密。大体的原理是这样的,https服务器生成或者申请一套证书,也就是公钥和私钥。如果是服务器自己生成的,那么客户端需要服务器提供一个公钥。实际上请求是通过http请求的,客户端生成一个随机的数作为对称加密的密钥,用公钥加密发送到服务器,服务器用私钥解密这个对称加密的密钥。这样双方都有对数据本身加密的对称加密公钥。就可以互相传送数据。过程就是首先通过私钥认证互通加密密钥,再用密钥进行通讯。说的太简单了,不过,这样好理解。

                   最后,在与服务器通信安全上,各个公司所采取的措施不一样。比如 小公司,或者初创公司,为了更快完成产品上线,在安全上不会考虑那么多;或者有些公共数据,不必安全处理;用户量越来越大,服务越来越多,在用户信息安全上,还有客户端与服务器通信安全上就不得不去考虑了。

              二、app本地数据通讯安全。

                 为什么要说app本地数据通讯安全?你想想哈,我们在做混淆的时候   有些类要做避免被混淆,还有我们本地数据库存信息也是不能改变;lsharedpreferces存储的xml文件数据。还有组件之间的通信,广播,某个图片或者数据标记,携带的明显关键字,有可能被反编译之后smali中查到。而被黑客利用。不要以为不可能,因为本地数据存储是在手机的本地存储data文件下,虽然访问需要系统权限,但是也不否定某些root的手机,这些在本地的数据很容易暴露出来。一些重要数据,或者标记存储本地的时候也应该进行加密,或者直接存储hash码,而不能直接存储明文。有些存储本地的数据,比如令牌,就需要进行加密处理。登录成功后的重要信息,如需要存储本地,也需要加密。

     app程序安全

               1) 在程序开发中,混淆是必要的,混淆的具体就不说了。要知道,混淆是对Java代码做的混淆,然而其它的资源文件,比如assets 里面的资源文件,还有res文件夹里面的资源等,还有AndroidManifest.xml配置文件里面的,都能够被反编译出来。尤其是配置文件里面,好多activity、service、broadcastReceiver 配置都在里面,intentfilter也在在里面配置,如果被修改里面的信息并重新打包,而因为这影响了程序的安全性,那么这将是非常糟糕的。所以在这里建议开发者,如果是非常重要的组建,不要在这里面进行配置,如果可以用fragment完成的,最好用fragment来做。并且重要的信息不要在配置文件里面配置。比如广告,他们只需要拿到apk,然后再解包,就可以拿到配置文件,修改intentfilter,自己建立activiy,或者其它组建,就可以因此嵌入广告,再重新打包签名。因此有的组建没必要在配置文件里面声明的,最好不要在里面声明。

                2)另外就是给程序加壳,也就是加固,目前有好过加固的工具,都可以用。我理解的加固是:对原有的apk加密,在和壳程序一起打成dex.替换壳程序里面的dex。打成新的apk,再用自己的apk签名进行对新的apk签名。实际是一个壳程序,但是里面运行壳程序进行对加密后的原程序解密。最终展现出来是原程序的内容。被反编译,也不能轻易得到原程序里面的数据了。

                 3)最后一个就是JNI编程。重要的算法,或者内容可以在C++中完成,然后Java native方法只负责调用。即使被反编译最重要的部分也是得到.so库。.so库相对来说很安全了。做三方库的公司,大都把sdk重要的打成.so库,我认为不光是因为Java不能够完成而只能c++完成,还有保密安全这一措施。

               

                 ok,个人理解,有不足的地方,请多多指正





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值