Android中锁定文件的方法
androidSDK中并没有锁定文件相关的api.
但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法:
- 用chmod命令修改文件读写权限
- 利用linux中的多线程独占锁,启动一个长期占用文件的后台线程
- 使用文件IO流,对文件的前1K字节进行加密,使其不能被识别为文件,或者读不出有意义的数据
这三种方法中最优雅的是第三种方法,下面结合金山文件锁的源码和技术文章等来详解第三种方法.
==================================技术分割线===================================
金山文件锁会在SD卡下生成一个.ksbox文件夹,这个文件夹下会保存加密后的文件.这个文件夹下有一个db.sqlite数据库文件,使用SQLite Database Browser打开后可以看到被加密文件的列表.
接下来去反编译金山的apk,最开始我使用的工具是dex2jar和java decompiler然而并没有看到加密核心代码.之后使用Apk IDE来反编译.
相关的核心代码在com/ijinshan/mPrivacy/c/j.smali文件中,里面是一些类似汇编的代码:
method public final read([BII)I
.locals 7
.parameter
.parameter
.parameter
.prologue
const/4 v6, 0x0
const/16 v5, 0x400
.line 61
iget-object v0, p0, Lcom/ijinshan/mPrivacy/c/j;->a:Ljava/io/FileInputStream;
invoke-virtual {v0, p1, p2, p3}, Ljava/io/FileInputStream;->read([BII)I
move-result v0
.line 63
const/4 v1, -0x1
if-ne v0, v1, :cond_0
.line 103
:goto_0
return v0
.line 70
:cond_0
iget-wide v1, p0, Lcom/ijinshan/mPrivacy/c/j;->f:J
const-wide/16 v3, 0x400
cmp-long v1, v1, v3
if-gtz v1, :cond_5
.line 73
iget-boolean v1, p0, Lcom/ijinshan/mPrivacy/c/j;->e:Z
if-nez v1, :cond_1
.line 75
iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->c:Lcom/ijinshan/mPrivacy/c/g;
iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->b:Ljava/lang/String;
invoke-static {v1}, Lcom/ijinshan/mPrivacy/c/g;->b(Ljava/lang/String;)[B
move-result-object v1
iput-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B
.line 76
iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B
if-eqz v1, :cond_1
.line 77
const/4 v1, 0x1
iput-boolean v1, p0, Lcom/ijinshan/mPrivacy/c/j;->e:Z
.line 80
:cond_1
if-ge v0, p3, :cond_3
move v1, v0
.line 82
:goto_1
add-int v2, p2, v1
if-gt v2, v5, :cond_4
.line 84
iget-object v2, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B
if-eqz v2, :cond_2
.line 85
iget-object v2, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B
invoke-static {v2, p2, p1, v6, v1}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 100
:cond_2
:goto_2
iget-wide v1, p0, Lcom/ijinshan/mPrivacy/c/j;->f:J
int-to-long v3, v0
add-long/2addr v1, v3
iput-wide v1, p0, Lcom/ijinshan/mPrivacy/c/j;->f:J
goto :goto_0
:cond_3
move v1, p3
.line 80
goto :goto_1
.line 89
:cond_4
if-ge p2, v5, :cond_2
.line 91
iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B
if-eqz v1, :cond_2
.line 92
iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B
sub-int v2, v5, p2
invoke-static {v1, p2, p1, v6, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
goto :goto_2
.line 98
:cond_5
const/4 v1, 0x0
iput-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B
goto :goto_2
.end method
还有一些和它相关联的函数,代码比较长就不全贴上来了,参考着文档对其进行分析的大概了解到金山的做法:
首先创建类继承InputStream,使用decodeStream函数得到输入流,重写read()方法,在方法体中对输入流的前1K字节进行解密,后面的字节直接从filename文件中读取.
解密的方法就是读取filename_e文件,每个字节异或0x6b
这样就得到了加密前的文件.
===========================技术分割线================================
这种方法算是所有方法中最优雅的方法了,虽然也有缺点(文件被误删),但是加解密计算小,只计算前1K字节.文件移动代价小,只要改变一下文件指针,就可以移动文件.速度快稳定性高.是业内主流的解决方案!
Android中锁定文件的方法的更多相关文章
- Android 中.aar文件生成方法与用法
https://i.cnblogs.com/EditPosts.aspx?opt=1 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Ja ...
- Android中获取文件路径的方法总结及对照
最近在写文件存贮,Android中获取文件路径的方法比较多,所以自己也很混乱.找了好几篇博客,发现了以下的路径归纳,记录一下,以备不时之需 Environment.getDataDirectory() ...
- 【转】Android中JNI的使用方法
Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- Android多线程编程<一>Android中启动子线程的方法
我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...
- Android中的文件读写总结
在Android中,文件主要分为两大类,内部存储和外部存储 内部存储的文件是程序私有的,分为普通文件和Cache文件 外部文件也可以是私有的,也可以是共有的,这要根据文件的目录位置来决定 共有文件可以 ...
- 在android中读写文件
在android中读写文件 android中只有一个盘,正斜杠/代表根目录. 我们常见的SDK的位置为:/mnt/sdcard 两种最常见的数据存储方式: 一.内存 二.本地 1.手机内部存储 2.外 ...
- Android中JNI的使用方法(转载)
Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...
- android中的提示信息显示方法(toast应用)
android中的提示信息显示方法(toast应用) (2011-10-17 11:02:06) 转载▼ 标签: android toast 杂谈 分类: Android android中toast的 ...
随机推荐
- [LeetCode] Spiral Matrix II 螺旋矩阵之二
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- 初探Socket
使用Socket Socket是两台主机之间的一个连接,它可以完成7个操作. 连接远程机器 发送数据 接收数据 关闭连接 绑定端口 监听入站数据 在绑定端口上接受来自远程机器的连接 Java中的Soc ...
- Python NaN
NaN, Not a Number, 非数. 它即不是无穷大, 也不是无穷小, 而是python/numpy/... 觉得无法计算时返回的一个符号(自己的推测, 未考证(TODO)). import ...
- 贝塔阶段html及pdf模块测试
这次虽然工作内容是将c#的html及pdf处理程序移植到java中,但是由于重新编写代码使得先前的工作成果得不到利用,于是将其编写为dll,再在java端调用. 这使得在java端即便每个分支都到达, ...
- Android基础总结(八)
服务两种启动方式(掌握) startService 开始服务,会使进程变成为服务进程 启动服务的activity和服务不再有一毛钱关系 bindService 绑定服务不会使进程变成服务进程 绑定服务 ...
- DUT Star Weekly Contest #3 Problem F Solution
题目链接 问题转化 \[a_i+a_j+(i-j)^2=a_i+i^2+a_j+j^2-2ij\] 令 \(b_i=a_i+i^2\) , 问题化为: 求 \[\max \{b_i+b_j-2ij\} ...
- js获取手机验证码倒计时的实现
方案一 <div class="div user-input"> <input type="number" class="code& ...
- windows常用快捷键
windows常用快捷键 Fn+F1:Windows的支持和帮助 =Windows 徽标+F1 Fn+F2:重命名对象 Fn+F3:查找所有文件 Fn+F4:选择“转到不同的文件夹”框并沿框中的项向下 ...
- Linux的3个文件时间
文件的三个时间相信大家都已经很熟悉windows操作系统了,当我们在windows系统下创建一个文件时,系统同时会为这个文件建立相关的参数去描述这个文件,如图: 这些参数包括文件的大小,文件类型,位置 ...
- 【总结】富有表现力的JavaScript
1.JavaScript的灵活性 JavaScript是目前最流行.应用最广泛的语言之一,它是一种极富表现力的语言,它具有C家族语言所罕见的特性.这种语言允许我们使用各种方式来完成同一个任务或者功能, ...