2757com 30

输入密码算法,入侵2757com、电脑丢失、电脑送修等都可能会导致自己的隐私文件泄露

ios图锁HQ应用项目源码,ioshq项目源码

“图锁 HQ” 是一个专门为图片定制的超级保险箱!

  • 保证图片100%安全!
  • 使用无损压缩算法压缩图片, 节约空间资源.
  • 使用超高安全级别的加密算法加密图片.
  • 每次进入应用,需要输入密码!
  • 图片以加密方式存储,只有您查看图片的时候才会解密.
    没有密码绝对无法查看图片内容!

 

源码下载:

PS: 第一张展示图片即为默认密码!

另外,

  1. 代码中使用了作者自己写的FMDB的数据库操作器: BaseDBMasterKey,
    非常简单就可以操作数据库!
  2. 代码中用于加密的密钥已经修改过了, 和已发布的app中的不一致,
    所以不会导致安全问题.
  3. 独创的密码界面; 支持从相册和iTunes导入图片.
  • 2757com 1
  • 2757com 2
  • 2757com 3
  • 2757com 4
  • 2757com 5  

详细说明:

“图锁 HQ”
是一个专门为图片定制的超级保险箱! – 保证图片100%安全! –
使用无损压缩算法压缩图片, 节约…

注意:对于这个加密算法系统是不会在某个系统版本改变的,因为你想如果加密算法变了,加入4.4用户升级到5.0,结果发现加密算法变了,手机解锁失败,用户会疯的,我页查看了2.3的代码,算法是一模一样的。所以就把算法整理了一份Java工程放到github上,感兴趣的同学可以下载查看或者直接使用操作即可。变的可能是设备的salt值,或者数据库文件等发生变化。但是加密算法是不会改变的。

一直有人问HTML加密混淆怎么做,其实这在业内是早已很多人研究过的课题。
假日期间整理一篇文章分享给大家。

2757com 6

三、root权限修改锁机密码

分析完了上面的锁机样本之后,我们知道现阶段都是这种需要授权操作,而这种授权一看就有修改锁屏密码,一个人上当之后后面可能就没人在上当了,所以我们得想到其他的办法进行更加狠的招制作样本。而上面提到的设备管理器有很多用途的,以前应用为了防止被用户卸载,也申请了这个权限。因为一旦一个应用具备了设备管理器就不会被卸载了,因为他的权限已经非常高了。不能被卸载。不过可以在设置页面查看有多少应用具备这个权限:

2757com 7

为了安全起见,像这种权限一般都是要选择拒绝的,安全性非常危险。一旦授权了,不堪设想。

既然前一篇我们已经知道了,设备的锁机加密算法,而且也知道他存在哪里,何不利用root权限来进行简单操作无需申请权限即可修改锁机密码,而对于这些想玩游戏利用辅助工具,对于root权限他们是可以接受的,因为他们并不知道root之后是干嘛呢?以为是更好的体验游戏效果。有了root权限之后,我们就简单了。直接弄一个新的密码,不管是手势密码还是复杂字符密码,然后通过加密算法加密,然后在写入到指定的key文件。重启设备生效即可。代码这里就不多说了,原理很简单:

2757com 8

这样我们可以构造一个九宫格手势密码,或者是数字密码,然后加密得到内容,在写到key文件中:

2757com 9

然后我们就可以写一个简单的锁机样本应用了,直接将修改的密码加密内容写入到应用沙盒文件中,然后在将文件覆盖系统的密码key文件,最后还得重启设备生效。当然这里是修改了字符密码,我们为了更大化操作,可以把手势密码也操作一下,这样就不管用户设备采用的是哪种类型密码都可以修改成功了。

 

2757com 10编码美丽技术圈微信扫一扫进入我的”技术圈”世界2757com 11扫一扫加小编微信添加时请注明:“编码美丽”非常感谢!2757com 12

一般而言,前端的代码,负责的是用户体验,后端的代码,负责更安全的数据处理。
前端不要涉及泄漏太多涉密信息,那么加密的意义不是特别大。
我很少在前端代码里看到值得保护的内容,比如高深的算法,很多代码是没必要牺牲用户体验来保护的。
但有些前端代码涉及最终用户的数据安全,此时还是要努力做数据保护的。

图7
用某工具便可一览无遗的加密后软件,并且可以随意的无阻碍访问二、一些可靠的加密方法

一、Android中加密算法

上一篇文章已经介绍了Android中系统锁屏密码算法原理,这里在来总结说一下:

第一种:输入密码算法

将输入的明文密码+设备的salt值,然后操作MD5和SHA1之后在转化成hex值进行拼接即可,最终加密信息保存到本地目录:/data/system/password.key中

第二种:手势密码算法

将九宫格手势密码中的点数据转化成对应的字节数组,然后直接SHA1加密即可。最终加密信息保存到本地目录中:/data/system/gesture.key中

 

2757com 13查看getSalt方法,他首先会根据字段key为:lockscreen.password_salt,进行从一个地方获取salt值,如果发现这个值为0,就随机生成一个,然后将其保存到那个地方去,最后会将salt转化成hex值即可。现在需要找到这个地方,继续跟踪代码:2757com 14这里猜想应该是保存到一个数据库中了,继续跟踪代码:2757com 15这里是通过SM中获取一个服务来进行操作了,之前我们已经把SM都玩烂了,像这种获取服务,最终实现逻辑都是在XXXService类中,所以这里应该是LockSettingsService.java类中,找到这个类,查看他的getLong方法:2757com 16其实到这里就非常肯定是数据库保存的了,继续跟踪代码:2757com 17这里果然是保存到一个数据库中,我们继续查看LockSettingStorage.java类:2757com 18

 

2757com 19

五、技术总结

到这里,我们就分析了如何修改Android中锁屏密码,主要有两种方式:

第一种:利用设备管理器权限,直接用系统提供的api修改

第二种:利用root权限和锁屏密码算法直接修改系统锁机密码文件内容

而这两种方式操作完成之后都需要重启设备生效,而对于这两种方式各有利弊,不过针对于一些游戏外挂root权限一般都是具备的,所以第二种是最优方案。而对于一些普通恶意应用root权限很少,可以利用第一种方式进行操作是最优方案。

 

加密算法源码:

 

第二、手势密码算法分析下面继续来分析手势密码,代码依然在LockPatternUtils.java中:

  1. 不要在前端放敏感数据
    这个听起来是废话,但真的很重要。
    有些开发者在手机端明文存用户的密码,这是非常危险的事情。
    即使是原生开发,一旦手机被root,也会造成数据泄漏。更何况HTML5开发。
    比较好的做法是手机端存token,而不是密码,这里有篇文章专门介绍这块,涉及做登录的开发者推荐仔细看看设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)

  2. js、css压缩
    压缩不是加密,也不是混淆。但压缩后的js文件,往往也具有混淆的功能。
    js、css压缩是很常见的技术,我们经常看到各种框架的文件名是xxx.min.js,xxx.min.css。
    使用合适的js、css压缩方案,可以减少文件体积、提高载入速度,最重要的是,它还能加快程序的执行性能。简直是有百利而无一害。
    压缩js比较常用的工具是yahoo的YUI混淆,在HBuilder里点菜单工具-插件安装,里面有YUI
    compress,可以压缩js和css。
    如果js、css比较大,发布前压缩下是比较推荐的做法。

  3. HTML、js、css混淆
    压缩虽然也能混淆,但不是以让别人看不懂为目的,混淆是真正以别人看不懂为目的。
    但是这样的混淆就不像压缩那么有百利而无一害了,它会降低程序执行性能。
    一些开发者不希望发行包解压后可以直接看到源码,那么此时可以使用混淆方案。
    网上搜索HTML混淆,资料和工具都非常多。
    原理都是类似的,js代码变成乱七八糟的字符串,然后用eval执行,HTML代码变乱七八糟字符串,用document.write或innerHTML执行,css也可以动态的在document.write里写<style>。
    这些工具有免费也有商业的,一般越商业的越难被反混淆。
    这个是免费的在线混淆工具 http://www.myobfuscate.com
    这个是比较知名的商业工具,http://www.jasob.com
    其实大家也可以根据原理自己写混淆算法。
    混淆也是一个有年头的成熟技术,比如Google在保护gmail的前端代码时,也是通过混淆来保护的。
    不管是压缩还是混淆,使用grunt来做发布是不错的方式,开发后一键调用grunt处理,非常便捷。

  4. 防止webkit remote debug,即防止浏览器控制台调试
    Android4.4及以上和iOS是支持webkit remote
    debug的,在HBuilder的教程里也有如何使用chrome调试Android应用,和使用safari调试iOS应用的教程。
    在HBuilder开发的App里,manifest.json里下的plus-distribute下有一个debug标签,标记为false后打包(可视化界面里也有配置),这样的包运行在手机上时webview会阻止浏览器的远程调试请求。
    如果你想调试,那么把debug改为true后再打包。
    当然有些Android rom不是很规范,并不能阻止调试,这属于rom的bug。
    另外注意只有打包才能防调试,真机运行是不能阻止调试的。

  5. 专业加密加固加壳服务
    由于Android的特殊性,针对apk出现了加固、加壳产业,这也是业内常见的apk保护方案。
    很多应用市场都提供加固服务,比如360手机助手的加固。
    还有一批专业公司如<a”>爱加密,里面有免费的基础安全保障服务,也有收费的高级安全保障服务。
    这里还有一个防止apk解压的小技巧:

  6. HBuilder的alpha版本提供的原生js混淆
    在HBuilder的alpha版(day build)里,官方提供了原生层面的js混淆。
    这种混淆的性能比纯前端混淆的性能要更好,反编译的难度也更大。但目前有个问题就是Android4以下的手机不能运行加密后的版本。所以还没有放到正式版HBuilder里。alpha版的HBuilder下载地址:
    百度云盘下载地址
    360云盘下载地址 访问密码 a309
    具体使用方式是在打包界面,可以选择需要加密的js文件,然后打包即可。

2757com 20

二、锁机样本原理解析

在上一篇文章中也说到了,为什么要看锁机密码加密算法,因为最近玩王者荣耀,下了一个外挂,结果被锁机了,太坑了,所以就来分析现在市场中通过锁机来勒索钱财的样本制作原理:

2757com 21

大部分都是采用了系统的设备管理器来获取权限进而修改密码,然后提示你需要重启设备才能有效,这样的样本通过特殊的应用名称和图标来诱导用户下载安装授权,一般小白用户为了玩农药,什么都不管了,直接从网上搜一个安装就开始操作了,结果被自己坑了,所以下载软件一定要去正规的应用市场去。别乱下载应用,而这样的锁机样本一般都是会选择加固,不过可惜他们为了节约成本都是用了非企业版的免费版加固,脱壳就比较简单了,然后逆向分析代码就可以找到他设置的锁机密码,然后解密即可。

而上面如果是一个小白用户被锁机了,几乎很难解决,因为这时候设备被锁屏了,连接电脑也是需要授权的,但是得先解锁,那么就会发现自己的手机和捡到的一样,没法操作了,不过可以选择拷贝rom到sd下,然后进行刷机或者恢复,这样的成本就很大了。所以一定要小心。

 

2757com 22这里看代码,有行和列之分,所以比如L形状的手势密码应该是:00
03 06 07
08,这样组成的五个长度的字节。这里为了验证手势密码是否正确,我们设置一个简单的手势密码:2757com 23然后在/data/system目录下生成一个密码文件:/data/system/gesture.key,弄出来用二进制工具查看,不然可能会看到的是乱码,这里用的是010Editor工具查看:2757com 24

接下来具体分析几种手段。

  简单加密步骤(以winrar为例):选择需要加密压缩的文件/文件夹→鼠标右键菜单中选择“添加到压缩文件”→在压缩选项中选择高级→设置密码→输入密码→确定即可。记得打包后删除没有加密的文件哦。其中“加密文件名”的选项是指没有密码的情况下打开该压缩包后能不能看到被压缩文件的文件名。

四、解决指纹锁问题

上面就利用root权限修改了用户的锁机密码,但是这里有一个问题,就是现在很多设备已经支持指纹锁了,而且指纹锁未来也是趋势,那么如果一个设备用了指纹锁,该怎么办?对于上面利用设备管理器权限就没法操作了。但是对于root权限我们仍然可以操作,我们在分析了锁机密码加密过程中发现,系统会把当前锁机类型值保存到数据库中:

2757com 25

这个值存在 /data/system/locksettings.db 数据库中,我们可以查看:

2757com 26

这个是十进制数据,我们可以转化成十六进制就是0x60000了,然后我们查看代码他对应的是哪种类型:

2757com 27

就是复杂的字符密码类型,当然还有其他类型,这个定义在DevicePolicyManager.java类中。那么到这里我们就有思路了,如果设备的类型是指纹锁,那么我们可以修改这个表格数据中的这个字段将其变成手势密码或者是字符密码类型,然后在将修改后的这两种类型密码写入到key文件,重启设备就就可以过滤了指纹锁密码了。因为我们有了root权限,读写这个数据库文件不难了,而具体实现代码这里就给了,感兴趣的同学可以尝试操作一下。

 

对于现在各种恶意锁机软件,Google官方在不同版本已经给出了防护方案(以下内容摘自安全网络):

Android L(Android 5.0-5.1)

在早期Android版本中,通过getRunningTasks方法可获取当前运行栈顶程序,但自Android
5.0起该方法被弃用,同时getRunningAppProcesses与getAppTasks方法的使用也受到了限制,由此抑制了劫持Activity类勒索软件的出现。

Android M(Android 6.0)

大部分手机勒索软件的惯用伎俩是通过SYSTEM_ALERT_WINDOW权限来打开特定系统类型窗口并将其显示在所有其他应用程序和窗口之上,以此达到锁定用户设备的目的。Android
M的出现使得勒索软件制马人在实施手机勒索时遇到了一大瓶颈——动态权限申请,由于自Android
M起,SYSTEM_ALERT_WINDOW开始被列为一种危险程度较高的权限而被特殊处理——即需要用户动态授权。这一改变意味着只要勒索软件的目标系统为Android
M,其就不能如往常一样在用户毫无防备的情况下锁定用户设备,而是必然有一个用户授权阶段,这对勒索软件的发展起到了一定程度的阻碍作用。

Android N(Android 7.0-7.1)

与之前版本可任意设置或重置锁屏密码不同的是,Android
N中明确规定,第三方应用开发者只能使用DevicePolicyManager.resetPassword为无密码设备设置初始密码,而不能重置或清除已有的设备密码。Android
N中对于resetPassword
API所添加的限制能阻止木马对已有锁屏密码的重置,从而使得部分勒索软件失效。

 

而对于窗口样式锁机最为常见,就是利用WindowManager设置最高权限,导致设备点击任何地方没有反应,而在Android
O中已经对这个窗口权限做了严重限制:Android
O预览版一经发布就给了勒索软件致命打击,新系统禁用了5种窗口。如下图所示,其中包括3种勒索软件常用的系统窗口类型,窗口置顶类勒索木马“赖以生存”的系统窗口类型被限制使用了。

 

在Android
O之前版本中,勒索软件通过调用特定系统窗口类型将自身窗口完全覆盖在第三方应用程序与其他系统窗口之上,用户无法响应其他窗口,由此设备被锁定;但在Android
O中,这几种具有置顶权限的系统窗口类型被弃用,勒索软件制作者找不到其他能完全覆盖第三方应用程序与其他系统窗口的窗口类型,窗口置顶类锁屏将无法实施。

在Android
6.0之前,使用系统类窗口进行手机勒索十分简单,只需要在AndroidManifest清单文件中申请SYSTEM_ALERT_WINDOW权限即可使用TYPE_SYSTEM_ALERT、TYPE_SYSTEM_ERROR等高级别窗口,用户开启手机勒索软件后无需额外操作甚至来不及做出反应,系统窗口就已置顶,手机即刻被锁定。

自Android 6.0起至Android
7.1,Android系统开启动态权限模型,SYSTEM_ALERT_WINDOW权限开始被列为一项特殊权,尽管其权限级别(Signature)不是Dangerous,但开发者在使用之前也必须动态获得用户授权,只有在用户进行授权后,应用才可以随意使用TYPE_SYSTEM_ALERT、TYPE_SYSTEM_OVERLAY、TYPE_SYSTEM_ERROR等高级别窗口。在这一阶段,用户通过一项Action——MANAGE_OVERLAY_PERMISSION打开设置“在其他应用的上层显示”页面,如下图所示,用户手动允许后,系统高级别窗口权限开放,此时即可成功使用这些窗口进行手机勒索。

 

 

为了最大化的还原算法,我们依然把源码代码拷贝出来,然后定义一个手势九宫格类,构造出这个手势的点数据:

我们先理下需求,加密的目的是什么?加密到什么级别?为此我们可以牺牲什么?
我们知道这个世界不存在绝对的安全,加密会被破解、混淆会被反混淆。
技术小白、开发者、黑客,是完全不同的级别,防范不同级别的人策略都不一样。
防范力度越大,投入代价也越大,比如聘请专业的安全公司。
除了投入,我们还需要考虑程序的执行性能和用户体验。
加密的代码在运行时必须解密,混淆后尤其是混淆HTML后,程序的执行性能会下降。
是否真的有必要做这类的源码保护,还需要谨慎取舍。

图9 加密选项

六、安全提示

但是到这里,是否对于这些恶意锁机软件用户就不能避免呢?当然可以避免,只要你不要有歪想法,比如你玩游戏为何想到外挂?你为何要去下载哪些不好的应用,因为你心中有杂念。如果你是一个纯真的用户,可能不会选择其他渠道下载应用,会去正规的市场中下载应用,这样你不可能被搞,如果你是一个心无杂念的用户,肯定不会随意授权给应用,不会选择root设备。那么究其原因,哪些非法分子就是利用一小部分人的歪念心里,制作了这个样本开始勒索。而如果一旦被勒索了,第一时间是想到的自己解决,刷机或者恢复,不可进行交钱解决,因为对于那些勒索钱财的,不可放纵,就是不要给钱。宁愿不要手机,也不给你。当然最后还想想说Android中的这个设备管理器权限特别是修改密码这个操作本来其实为了用户设备丢失,进行定位擦除数据或者修改密码来避免手机更多信息被窃取弄的,但是这样的api被乱用之后也是不合理的,如果可以期待系统能更加的优化这一块的功能。

加密算法源码:

  PGP是90年代由美国的Phil
Zimmermann研究成功的,采用了RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等,可以用来加密文件,还可以代替UUencode
生成 RADIX 64 格式(就是MIME 的 BASE
64格式)的编码文件,创造性地把RSA公匙体系的方便和传统加密体系的高速度结合起来,并且在数字签名和密匙认证管理机制上有巧妙的设计。是目前最难破译的,密码体系之一。

2757com 28

  简单加密步骤:安装注册大狼狗(必须牢记的密码重设问题)→选择需要加密的文件/文件夹→鼠标右键菜单中选择“升级为大狼狗文件夹”→完成加密。即时你用非常规方法把加密的文件保存出来,当你打开的时会知道这些文件已经经过了加密处理,已经无法打开了。

2757com 29

  本文例子中在笔者的D盘创建了一个名为“测试文件夹”的文件夹,里边有个名为“测试文档.doc”的文件。我们用某款所谓的加密软件进行加密。

第二种:手势密码算法这个其实网上已经有人给出了一个密码库了,因为九宫格的图案可以全部算出,然后将其转化成字节数据,在用加密算法加密就能生成一个手势密码库了。具体信息可以自行网上搜索了。

2757com 30

这里看到有一个方法:passwordToHash方法,参数为用户输入的密码和当前用户对应的id,一般设备不会有多个用户,所以这里一般userId默认值就是0,下面就是最为核心的加密算法了:原文密码+设备的salt值,然后分别MD5和SHA-1操作,转化成hex值再次拼接就是最终保存到本地的加密密码了。而这里现在最重要的是如何获取设备对应的salt值了,这个可以一步一步跟踪代码:

图5 测试文件夹

发表评论

电子邮件地址不会被公开。 必填项已用*标注