[免费专栏] Android安全之Android加密算法浅析


也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历


转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球

感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步


Android安全付费专栏长期更新,本篇最新内容请前往:

0x01 前言

车机渗透,博主感觉大致可分为:软件层、系统层、硬件层

例如,我们测试软件层以及系统层的时候,会关注一些加密算法以及该密码或敏感数据是否加密或加密后又如何解析,它们又存放在哪个位置等等。

例如,Android设备(也可以是手机,也可以是智能大屏等)解锁屏幕时输入的密码,那么这个密码存放在哪里?是否为明文存储?如果是加密存储,那么加密算法是什么?

例如,连接一些车机WI-FI时,为了安全考虑会要求输入PIN码才能连接成功,那么此时我们要考虑该PIN码输入的密码,那么这个密码存放在哪里?是否为明文存储?如果是加密存储,那么加密算法是什么?

0x02 Android加密算法浅析

这里以Android 里面的锁屏为例,来对加密算法了解,以点盖面

Android 设备中常见的锁屏密码主要有两种:一种是手势密码(九宫格密码图);一种是输入密码,分为PIN密码和复杂字符密码,而PIN密码就是数字密码,比较简单;还有一种是指纹密码

我们这里主要关注PIN码来说说,通过工具获取当前PIN输入界面的View类,然后定位到一个锁屏密码工具类:LockPatternUtils.java

此处,大家可以思考一个小问题:假如有一台智能后视镜,智能电视机等硬件设备, 本身开启热点,但需要输入PIN码才能接入,但当前设备可root接入,你会怎么办呢?是拆卸机器从串口进行攻击?还是adb进入系统?

这里以5.1版本的源码进行分析,至于真机或模拟器,当前按照自身条件来。

2.1 源码编译(此处可跳过)

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:

REPO_URL = 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo'

在这里插入图片描述
然后repo sync 一下同步

在这里插入图片描述
后续步骤省略,,自行查找。网上容易出现问题的是源地址错误等问题。

Windows 下载Android源码教程链接

模拟器博主用的是夜神模拟器(夜神默认手机机型是三星,大家可切换一下机型方便测试):

在这里插入图片描述探测一下试试是否能成功连接夜神模拟器:

adb connect 127.0.0.1:62001
adb devices
adb shell
  • 简短的Android版本历史

Android 1.5纸杯蛋糕:2009年4月27日
Android 1.6,Donut: 2009年9月15日
Android 2.0-2.1,Eclair: 2009年10月26日(初始版本)
Android 2.2-2.2.3,Froyo:2010年5月20日(初始版本)
Android 2.3-2.3.7,姜饼:2010年12月6日(初始版本)
Android 3.0-3.2.6,Honeycomb:2011年2月22日(初始版本)
Android 4.0-4.0.4,冰淇淋三明治:2011年10月18日(初始版本)
Android 4.1-4.3.1,Jelly Bean:2012年7月9日(初始版本)
Android 4.4-4.4.4,KitKat: 2013年10月31日(初始版本)
Android 5.0-5.1.1,棒棒糖:2014年11月12日(初始版本)
Android 6.0-6.0.1,棉花糖:2015年10月5日(初始版本)
Android 7.0-7.1.2,牛轧糖:2016年8月22日(初始版本)
Android 8.0-8.1,奥利奥(Oreo):2017年8月21日(初始版本)
Android 9.0,Pie:八月6,2018
Android 10.0:2019年9月3日
Android 11:2020年9月8日
Android 12:2021年10月4日

博主,编译老是出错,最后直接下载现有的好了,地址如下(Android 5.1.1):Android 5.1.1源码

2.2 Android 锁屏源码浅析

源码下载好后,开始正式进入正题,定位到锁屏的java代码,了解锁屏界面输入密码的规则,此处我们使用Android-SDK 3.0.1 (这里你也可以使用最新版的,都是一样的)中的uiautomatorviewer.bat(该工具默认是安装在C盘当前用户的/AppData/local/Android/Sdk/tools/bin目录下)工具分析获取当前的锁屏View类LockPattern,一步步追踪,最终会跟到一个包名为com.android.internal.widget锁屏密码工类:LockPatternUtils.java,如下图:

下载地址:https://developer.android.com/studio/archive?hl=zh-cn

锁屏代码的目录路径:frameworks/base/core/java/com/android/internal/widget/LockPatternView.java

如果是,下载的Github的源码的话在文件的android\internal\widget目录下

checkPasswordHistory的方法,这个方法就是来对比密码是否一致的,能否成功解锁手机的

在这里插入图片描述

passwordToHash方法就是输入密码的算法,继续跟踪(passwordToHash()方法):

在这里插入图片描述

从上面代码的注释中已经告诉我们,这个View是用于绘制九宫格和手势密码的地方。passwordToHash 方法中的参数为用户输入的密码和当前用户对应的id,一般设备不会有多个用户,所以这里的userId是默认值0。再往下看就是加密算法了:原文密码+设备的salt值,然后分别进行SHA-1和Md5加密,将数据复制到一个数组中后转换成Hex编码进行拼接,得到的就是最终保存到本地的加密密码内容。而这里最重要的是如何获取设备对应的salt值,这可以跟踪代码(getsalt()方法):

在这里插入图片描述

查看getsalt方法(如何获取到设备对应的salt值),long salt = getLong(LOCK_PASSWORD_SALT_KEY, 0, userId);,首先根据字段key为lockscreen.password_salt从某个地方获取salt值,通过if判断该值为0的话,就调用SecureRandom.getInstance(“SHA1PRNG”).nextLong()随机生成一个,然后将其保存到key为LOCK_PASSWORD_SALT_KEY的那个方法,最后将salt值转换为Hex值即可,继续跟踪代码(getLong()方法):

在这里插入图片描述

应该是把密码保存起来了,继续跟踪代码(getLockSettings()方法):

在这里插入图片描述

通过getLong()方法发现这个地方用了AIDL类型,通过在ServiceManager中获取一个服务来进行操作,那么它应该是有相应的Service类,这里是在包名为com.android.server.locksettings下的LockSettingsService.java类,找到这个类,查看它的getLong方法

frameworks/base/services/core/java/com /android/server /LockSettingsService.java

如果是,下载的Github的源码的话在文件的com\android\server目录下

在这里插入图片描述

到此,我们已经可以确定该Service类是保存在数据库中的了,而且在LockSettingsService构造方法中存在SQLiteDatabase的字眼

PS:SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法

在这里插入图片描述在这里插入图片描述

这里调用了mStorage方法,继续跟踪代码

在这里插入图片描述

从上图中的mStorage = new LockSettingsStorage(context, new LockSettingsStorage.Callback() 可以看到,将输入的密码存放到了数据库中,继续跟踪代码:

到LockSettingsStorage方法中去看一下

在这里插入图片描述在这里插入图片描述

数据库名字叫做:locksettings.db,那么它保存在哪里呢?

在这里插入图片描述

两个key文件,那么这个就是用来保存加密之后的手势密码和输入密码的信息到本地,下次开机解锁就需要读取这个文件内容进行密码比对了,查看具体的存在路径:

find -name / locksettings.db

在这里插入图片描述

SQLite Expert Professional 是一个专用高级可靠的工具,旨在帮助大家同时管理多个数据库,并且执行各种数据库语法。由于所有菜单功能集成到一个简约易懂的窗口中,刚入门的人员和专业人员都能很好的掌握该工具。在主窗口中,用户可以直接明了的查看所有已连接的数据库,并使用相关的语法进行操作。左侧区域为可用表,能够进行字段重组、外键、触发器等功能,并且不会丢失任何数据库信息。如果需要连接或者打开新的数据库,则可以通过菜单中的文件选项进行操作,并为文件名或者新数据库重新命名。除此之外,该工具还能轻松处理并纠正故障,保证数据库不会受到外界的干扰和影响。

首先设置锁屏密码(模拟器中设置锁屏密码):

在这里插入图片描述

PS:

/data/data/com.android.providers.settings/databases/databasessettings.db(Android 4.0及以前)

/data/system/locksettings.db(Android4.1及以后)

单独拷贝locksettings.db 是没数据的,如下:

在这里插入图片描述

应该将locksettings.db-shm、locksettings.db-wal 一起拷贝出来

adb pull /data/system/locksettings.db
adb pull /data/system/locksettings.db-shm
adb pull /data/system/locksettings.db-wal

在这里插入图片描述

salt值:-2428488924405522123

还有一个加密密码Key文件

adb pull /data/system/password.key .
E03FF03CA6C923FC3D7BE13ECA1AD9E159917CD7F901431E8569A3F7F815E570E758EBD5

最终的值应该是类似这样的(MD5(输入明文密码+设备的salt).Hex+SHA1(输入明文密码+设备的salt).Hex就是最终的加密内容)拼接起来就是密码:

在这里插入图片描述在这里插入图片描述

但我这里借出来跟原生程序不太一样,发现是模拟器用的是三星的系统,这个系统对锁屏做过修改,没有用原生程序,网上有代码说是做了1024次Sha1运算,此处可以使用hashcat 爆破,三星做了1024次Sha1运算代码如下:

public byte[] passwordToHash(String paramString)
  {
    if (paramString == null)
      return null;
    String str = null;
    byte[] arrayOfByte1 = null;
    try
    {
      byte[] arrayOfByte2 = (paramString + getSalt()).getBytes();
      byte[] arrayOfByte3 = null;
      str = "SHA-1";
      MessageDigest localMessageDigest = MessageDigest.getInstance(str);
      long l1 = System.currentTimeMillis();
      for (int i = 0; i < 1024; i++)
      {
        arrayOfByte1 = null;
        if (arrayOfByte3 != null)
          localMessageDigest.update(arrayOfByte3);
        localMessageDigest.update(("" + i).getBytes());
        localMessageDigest.update(arrayOfByte2);
        arrayOfByte3 = localMessageDigest.digest();
      }
      arrayOfByte1 = toHex(arrayOfByte3).getBytes();
      long l2 = System.currentTimeMillis();
      Log.w("LockPatternUtils", "passwordToHash time = " + (l2 - l1) + "ms");
      return arrayOfByte1;
    }
    catch (NoSuchAlgorithmException localNoSuchAlgorithmException)
    {
      Log.w("LockPatternUtils", "Failed to encode string because of missing algorithm: " + str);
    }
    return arrayOfByte1;
  }

PIN或复杂密码,因为salt 值是随机的,且输入密码加salt后再sha1+md5拼接复杂的多,所以安全性相对九宫格密码要安全一些

参考链接:

http://blog.md5.red/?p=456

http://www.520monkey.com/archives/1022


你以为你有很多路可以选择,其实你只有一条路可以走


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
rk3568 android11从入门到实战项目专栏是一本关于使用rk3568芯片开发Android 11应用的指南和实践教程。本专栏包含多个章节,主要围绕rk3568芯片和Android 11进行介绍和讲解,旨在帮助读者了解如何使用rk3568芯片进行应用开发,并将所学知识应用到实际项目中。 目录和介绍如下: 第一章:rk3568简介 本章主要介绍了rk3568芯片的基本信息,包括其性能特点、硬件规格以及适用的应用场景等。读者将通过本章了解到rk3568芯片的工作原理和基本特性。 第二章:Android 11简介 本章将介绍Android 11的特性和更新内容,包括新的用户界面、增强的隐私和安全特性,以及其他一些性能优化和功能改进。读者将了解到Android 11相较于之前的版本有哪些改进和新功能。 第三章:rk3568开发环境搭建 本章将指导读者如何搭建rk3568开发环境,包括SDK的安装、驱动的配置以及相关工具的设置等。通过本章的学习,读者将具备开发rk3568应用所需的基本环境。 第四章:Android应用开发基础 本章将介绍Android应用开发的基本知识,包括Android应用架构、布局设计、界面元素及交互等方面的内容。读者将通过本章学习到如何基于Android平台进行应用开发。 第五章:rk3568与Android 11集成开发 本章将介绍如何将rk3568芯片与Android 11进行集成开发,包括相关API的使用、硬件调用、外设控制等方面的内容。读者将学习到如何充分发挥rk3568与Android 11的协同作用,实现更强大的功能和扩展性。 第六章:实战项目案例 本章将以实际项目案例为基础,通过实践演练来加深读者对rk3568与Android 11开发的理解和掌握程度。项目案例将包括应用程序的设计、开发和测试等环节,并结合rk3568芯片的特性和Android 11的功能来实现一个完整的实际应用。 通过学习本专栏,读者将掌握使用rk3568芯片进行Android 11应用开发的基本技能和知识,并能够在实际项目中运用所学知识。这对于对rk3568芯片和Android 11开发感兴趣的从业人员和学习者来说,将是一本实用的学习资料和指导手册。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙留香Park

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值