Android加密算法浅析

原创 橙留香Park 2022-09-08 00:01

本篇文章遇到排版混乱的地方,可点击文末阅读原文或前往该地址:https://orangey.blog.csdn.net/article/details/126219765

更多关于Android安全的知识,可前往:https://blog.csdn.net/ananas_orangey/category_11955914.html


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/repochmod 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:62001adb 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源码:https://github.com/AndroidSDKSources/android-sdk-sources-for-api-level-22


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


橙留香Park 橙留香来自一位三流剑客之乡,担任威胁猎手,脑子不会转弯,属于安全特学脑。橙留香同学[小菜鸟],定期分享从零入门车联网安全(包括基础知识储备)技术。只为你呈现有价值的信息,专注于车联网安全领域之Android终端反入侵技术研究。
评论
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 110浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 176浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 166浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 122浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 115浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 90浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 80浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 76浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 193浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 72浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 93浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 71浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 171浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 48浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 79浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦