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终端反入侵技术研究。
评论
  • 一、VSM的基本原理震动样品磁强计(Vibrating Sample Magnetometer,简称VSM)是一种灵敏且高效的磁性测量仪器。其基本工作原理是利用震动样品在探测线圈中引起的变化磁场来产生感应电压,这个感应电压与样品的磁矩成正比。因此,通过测量这个感应电压,我们就能够精确地确定样品的磁矩。在VSM中,被测量的样品通常被固定在一个震动头上,并以一定的频率和振幅震动。这种震动在探测线圈中引起了变化的磁通量,从而产生了一个交流电信号。这个信号的幅度和样品的磁矩有着直接的关系。因此,通过仔细
    锦正茂科技 2025-02-28 13:30 100浏览
  • 美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?‌美国加州CEC能效认证与美国DOE能效认证在多个方面存在显著差异‌。认证范围和适用地区‌CEC能效认证‌:仅适用于在加利福尼亚州销售的电器产品。CEC认证的范围包括制冷设备、房间空调、中央空调、便携式空调、加热器、热水器、游泳池加热器、卫浴配件、光源、应急灯具、交通信号模块、灯具、洗碗机、洗衣机、干衣机、烹饪器具、电机和压缩机、变压器、外置电源、消费类电子设备
    张工nx808593 2025-02-27 18:04 120浏览
  •         近日,广电计量在聚焦离子束(FIB)领域编写的专业著作《聚焦离子束:失效分析》正式出版,填补了国内聚焦离子束领域实践性专业书籍的空白,为该领域的技术发展与知识传播提供了重要助力。         随着芯片技术不断发展,芯片的集成度越来越高,结构也日益复杂。这使得传统的失效分析方法面临巨大挑战。FIB技术的出现,为芯片失效分析带来了新的解决方案。它能够在纳米尺度上对芯片进行精确加工和分析。当芯
    广电计量 2025-02-28 09:15 116浏览
  • 振动样品磁强计是一种用于测量材料磁性的精密仪器,广泛应用于科研、工业检测等领域。然而,其测量准确度会受到多种因素的影响,下面我们将逐一分析这些因素。一、温度因素温度是影响振动样品磁强计测量准确度的重要因素之一。随着温度的变化,材料的磁性也会发生变化,从而影响测量结果的准确性。因此,在进行磁性测量时,应确保恒温环境,以减少温度波动对测量结果的影响。二、样品制备样品的制备过程同样会影响振动样品磁强计的测量准确度。样品的形状、尺寸和表面处理等因素都会对测量结果产生影响。为了确保测量准确度,应严格按照规
    锦正茂科技 2025-02-28 14:05 134浏览
  • RGB灯光无法同步?细致的动态光效设定反而成为产品客诉来源!随着科技的进步和消费者需求变化,电脑接口设备单一功能性已无法满足市场需求,因此在产品上增加「动态光效」的形式便应运而生,藉此吸引消费者目光。这种RGB灯光效果,不仅能增强电脑周边产品的视觉吸引力,还能为用户提供个性化的体验,展现独特自我风格。如今,笔记本电脑、键盘、鼠标、鼠标垫、耳机、显示器等多种电脑接口设备多数已配备动态光效。这些设备的灯光效果会随着音乐节奏、游戏情节或使用者的设置而变化。想象一个画面,当一名游戏玩家,按下电源开关,整
    百佳泰测试实验室 2025-02-27 14:15 137浏览
  • 在物联网领域中,无线射频技术作为设备间通信的核心手段,已深度渗透工业自动化、智慧城市及智能家居等多元场景。然而,随着物联网设备接入规模的不断扩大,如何降低运维成本,提升通信数据的传输速度和响应时间,实现更广泛、更稳定的覆盖已成为当前亟待解决的系统性难题。SoC无线收发模块-RFM25A12在此背景下,华普微创新推出了一款高性能、远距离与高性价比的Sub-GHz无线SoC收发模块RFM25A12,旨在提升射频性能以满足行业中日益增长与复杂的设备互联需求。值得一提的是,RFM25A12还支持Wi-S
    华普微HOPERF 2025-02-28 09:06 143浏览
  • 更多生命体征指标风靡的背后都只有一个原因:更多人将健康排在人生第一顺位!“AGEs,也就是晚期糖基化终末产物,英文名Advanced Glycation End-products,是存在于我们体内的一种代谢产物” 艾迈斯欧司朗亚太区健康监测高级市场经理王亚琴说道,“相信业内的朋友都会有关注,最近该指标的热度很高,它可以用来评估人的生活方式是否健康。”据悉,AGEs是可穿戴健康监测领域的一个“萌新”指标,近来备受关注。如果站在学术角度来理解它,那么AGEs是在非酶促条件下,蛋白质、氨基酸
    艾迈斯欧司朗 2025-02-27 14:50 400浏览
  •           近日受某专业机构邀请,参加了官方举办的《广东省科技创新条例》宣讲会。在与会之前,作为一名技术工作者一直认为技术的法例都是保密和侵权方面的,而潜意识中感觉法律有束缚创新工作的进行可能。通过一个上午学习新法,对广东省的科技创新有了新的认识。广东是改革的前沿阵地,是科技创新的沃土,企业是创新的主要个体。《广东省科技创新条例》是广东省为促进科技创新、推动高质量发展而制定的地方性法规,主要内容包括: 总则:明确立法目
    广州铁金刚 2025-02-28 10:14 103浏览
  • 在2024年的科技征程中,具身智能的发展已成为全球关注的焦点。从实验室到现实应用,这一领域正以前所未有的速度推进,改写着人类与机器的互动边界。这一年,我们见证了具身智能技术的突破与变革,它不仅落地各行各业,带来新的机遇,更在深刻影响着我们的生活方式和思维方式。随着相关技术的飞速发展,具身智能不再仅仅是一个技术概念,更像是一把神奇的钥匙。身后的众多行业,无论愿意与否,都像是被卷入一场伟大变革浪潮中的船只,注定要被这股汹涌的力量重塑航向。01为什么是具身智能?为什么在中国?最近,中国具身智能行业的进
    艾迈斯欧司朗 2025-02-28 15:45 221浏览
  • 1,微软下载免费Visual Studio Code2,安装C/C++插件,如果无法直接点击下载, 可以选择手动install from VSIX:ms-vscode.cpptools-1.23.6@win32-x64.vsix3,安装C/C++编译器MniGW (MinGW在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序.)4,C/C++插件扩展设置中添加Include Path 5,
    黎查 2025-02-28 14:39 140浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦