1. 在网上下载了SQLcipher这个软件 解压缩后 发现算是Win7下无法运行的文件格式 是这个软件
最近正在搞这个开源项目的跨平台编译,这个软件是支持windows的,你要么下载源码在windows下编译出.exe,还可以编译出windows下的lib库利用api写代码操作,要么下载别人编译好的.exe,你搜一下吧,csdn我就下了一份
2. 小米手机微信删除的聊天记录怎么查看
方法一:通过“SQLCipher.exe”程序将微信聊天数据库“EnMicroMsg.db”进行解密来获取所有聊天记录。
首先,查看一下当前手机MIUI系统的版本:进入“设置”界面,点击“关于手机”项即可进入手机MIUI系统版本界面。
3. android 怎么使用sqlcipher
Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作。数据库存储是我们经常会使用到的一种存储方式,相信大多数朋友对它的使用方法都已经比较熟悉了吧。在Android中,我们既可以使用原生的SQL语句来对数据进行操作,也可以使用Android API提供的CRUD方法来对数据库进行操作,两种方式各有特点,选择使用哪一种就全凭个人喜好了。
不过,使用SQLite来存储数据却存在着一个问题。因为大多数的Android手机都是Root过的,而Root过的手机都可以进入到/data/data/<package_name>/databases目录下面,在这里就可以查看到数据库中存储的所有数据。如果是一般的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的程序就会面临严重的安全漏洞隐患。那么今天,就让我们一起研究一下如何借助SQLCipher来解决这个安全性问题。
SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。SQLCipher支持很多种不同的平台,这里我们要学习的自然是Android中SQLCipher的用法了。
首先要把Android项目所依赖的SQLCipher工具包下载下来:
接着解压这个工具包,会看到里面有assets和libs这两个目录,稍后需要将这两个目录中的内容添加到Android项目当中。那么现在我们就来新建一个Android项目,项目名就叫SQLCipherTest。观察SQLCipherTest的项目结构,发现里面也分别有一个assets目录和一个libs目录,那么现在就可以把SQLCipher工具包中这两个目录里的内容复制过来。并不需要复制全部文件,选择必要的文件进行复制就可以
到这里准备工作就全部完成了,接下来我们开始编写代码。首先创建一个MyDatabaseHelper继承自SQLiteOpenHelper,注意这里使用的并不是Android API中的SQLiteOpenHelper,而是net.sqlcipher.database包下的SQLiteOpenHelper,代码如下所示:
java">[java]viewplain
importandroid.content.Context;
importnet.sqlcipher.database.SQLiteDatabase;
importnet.sqlcipher.database.SQLiteDatabase.CursorFactory;
importnet.sqlcipher.database.SQLiteOpenHelper;
{
publicstaticfinalStringCREATE_TABLE="createtableBook(nametext,pagesinteger)";
publicMyDatabaseHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){
super(context,name,factory,version);
}
@Override
publicvoidonCreate(SQLiteDatabasedb){
db.execSQL(CREATE_TABLE);
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intarg1,intarg2){
}
}
除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。可以看到,我们在onCreate()方法中创建了一张Book表,Book表里有name和pages这两个列。
接着,打开或新建activity_main.xml作为程序的主布局文件,代码如下所示:
[html]viewplain
<LinearLayoutxmlns:android="
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"
/>
<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询数据"
/>
</LinearLayout>
这里只是简单地放置了两个按钮,分别用于添加和查询数据。接下来打开或新建MainActivity作为程序主Activity,代码如下所示:
[java]viewplain
{
privateSQLiteDatabasedb;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase.loadLibs(this);
MyDatabaseHelperdbHelper=newMyDatabaseHelper(this,"demo.db",null,1);
db=dbHelper.getWritableDatabase("secret_key");
ButtonaddData=(Button)findViewById(R.id.add_data);
ButtonqueryData=(Button)findViewById(R.id.query_data);
addData.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
ContentValuesvalues=newContentValues();
values.put("name","达芬奇密码");
values.put("pages",566);
db.insert("Book",null,values);
}
});
queryData.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Cursorcursor=db.query("Book",null,null,null,null,null,null);
if(cursor!=null){
while(cursor.moveToNext()){
Stringname=cursor.getString(cursor.getColumnIndex("name"));
intpages=cursor.getInt(cursor.getColumnIndex("pages"));
Log.d("TAG","booknameis"+name);
Log.d("TAG","bookpagesis"+pages);
}
}
cursor.close();
}
});
}
}
可以看到,在onCreate()方法中首先调用了SQLiteDatabase的loadLibs()静态方法将SQLCipher所依赖的so库加载进来,注意这里使用的是net.sqlcipher.database包下的SQLiteDatabase。然后我们创建了MyDatabaseHelper的实例,并调用getWritableDatabase()方法去获取SQLiteDatabase对象。这里在调用getWritableDatabase()方法的时候传入了一个字符串参数,它就是SQLCipher所依赖的key,在对数据库进行加解密的时候SQLCipher都将使用这里指定的key。
在添加数据按钮的点击事件里面,我们通过ContentValues构建了一条数据,然后调用SQLiteDatabase的insert()方法将这条数据插入到Book表中。
在查询数据按钮的点击事件里面,我们调用SQLiteDatabase的query()方法来查询Book表中的数据,查询到的结果会存放在Cursor对象中,注意这里使用的是net.sqlcipher包下的Cursor。然后对Cursor对象进行遍历,并将查询到的结果打印出来。
现在运行一下程序,先点击添加数据按钮,再点击查询数据按钮,刚刚添加的那条数据就应该在控制台里打印出来了。
有没有感觉到使用SQLCipher提供的API和使用Android原生的数据库API,操作起来几乎是一模一样的。没错,SQLCipher对Android SDK中所有与数据库相关的API都制作了一份镜像,使得开发者可以像操作普遍的数据库文件一样来操作SQLCipher,而所有的数据加解密操作,SQLCipher都在背后帮我们处理好了。
4. 小米6误删微信记录怎么办
您好!很高兴能为您解答, 方法一:通过“SQLCipher.exe”程序将微信聊天数据库“EnMicroMsg.db”进行解密来获取所有聊天记录。
对此手机需要获取ROOT权限,由于小米开发版系统自带ROOT权限,因此无法再进行Root。对于小米稳定版系统,则需要借助“Root精灵”来获取小米手机ROOT权限。
有关获取小米稳定版ROOT权限的方法,请参考以下教程:
http://jingyan..com/article/2c8c281dab10ad0008252a1a.html
接下来需要获取小米手机微信聊天记录数据库文件“EnMicroMsg.db”,并利用“SQLCipher.exe”工具破解“EnMicroMsg.db”文件,从而获得当前微信中所有好友的聊天记录,包括已删除的聊天记录。
重点需要补充一点,由于“EnMicroMsg.db”微信聊天记录数据库文件基于SQLCipher 2.X版本进行加密,而从网上下载的“SQLCipher”程序则是3.0版本,因此在利用“SQLCipher”(即“SQLite Database Browser”)程序读取“EnMicroMsg.db”数据库时,将提示“无法找到SQLite 3类型数据库”错误信息。
针对此类情况,我们需要进入“SQLCipher”官方网站(https://www.zetetic.net/sqlcipher/open-source/“,从其页面中下载“SQLCipher for Android”开源代码。
并将所获得的“SQLCipher for Android”源码,通过利用“Eclipse”等集成开发环境,创建一个新的Andorid工程,并重新进行编译以获得可运行的“SQLite Database Browser”程序。
方法二:借助相关微信聊天记录恢复软件来恢复已删除的微信聊天记录。此类软件网上较多,大家可以根据自己的实际需要进行有选择性的购买。在此小编只是简单的与大家介绍一下其使用方法。
8
首先我们还是需要获取微信聊天记录数据库文件“EnMicroMsg.db”,可以使用以上方法来获取,也可以使用“刷机精灵”提供的“资料备份”功能来获取聊天记录数据库及其它相关资源文件。
5. 小米3手机 微信聊天记录怎么恢复尤其是图片 跪求大神
您好!很高兴能为您解答, 微信误删聊天记录恢复方法
1
方法一:通过“SQLCipher.exe”程序将微信聊天数据库“EnMicroMsg.db”进行解密来获取所有聊天记录。
对此手机需要获取ROOT权限,由于小米开发版系统自带ROOT权限,因此无法再进行Root。对于小米稳定版系统,则需要借助“Root精灵”来获取小米手机ROOT权限。
2
接下来需要获取小米手机微信聊天记录数据库文件“EnMicroMsg.db”,并利用“SQLCipher.exe”工具破解“EnMicroMsg.db”文件,从而获得当前微信中所有好友的聊天记录,包括已删除的聊天记录。
3
在此小编重点需要补充一点,由于“EnMicroMsg.db”微信聊天记录数据库文件基于SQLCipher 2.X版本进行加密,而从网上下载的“SQLCipher”程序则是3.0版本,因此在利用“SQLCipher”(即“SQLite Database Browser”)程序读取“EnMicroMsg.db”数据库时,将提示“无法找到SQLite 3类型数据库”错误信息。
4
针对此类情况,我们需要进入“SQLCipher”官方网站从其页面中下载“SQLCipher for Android”开源代码。
5
并将所获得的“SQLCipher for Android”源码,通过利用“Eclipse”等集成开发环境,创建一个新的Andorid工程,并重新进行编译以获得可运行的“SQLite Database Browser”程序。
6
同时在正式编译之前,需要对代码进行修改,以实现兼容SQLite 2.X数据库的加密和解密操作。如图所示,一定要添加如下语句:
database.rawExecSQL("PRAGMA cipher_migrate")
此语句用于实现兼容SQLite 2.X数据库文件。
7
方法二:借助相关微信聊天记录恢复软件来恢复已删除的微信聊天记录。此类软件网上较多,大家可以根据自己的实际需要进行有选择性的购买。在此小编只是简单的与大家介绍一下其使用方法。
8
首先我们还是需要获取微信聊天记录数据库文件“EnMicroMsg.db”,可以使用以上方法来获取,也可以使用“刷机精灵”提供的“资料备份”功能来获取聊天记录数据库及其它相关资源文件。
9
接下来打开“微信聊天记录恢复”软件,从弹出的“打开微信记录”窗口中,定位到微信聊天记录“MicroMsg”文件件,点击“读取数据”按钮。将当前登陆微信的所有账户列出后,选择想要恢复聊天记录的账户,点击“查看记录”按钮。
10
此时将自动显示当前微信账户下的所有好友的聊天记录,如果想恢复被删除的聊天记录,只需要点击“扫描删除聊天记录”,即可找到已删除但未被覆盖的微信聊天记录。
6. SQLCipher android 数据库加密 couldn't find "libsqlcipher.so"
错误描述:
java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader[DexPathList[[zip file"/data/app/org.xiao-2/base.apk"],nativeLibraryDirectories=[/data/app/org.xiao-2/lib/arm64,/data/app/org.xiao-2/base.apk!/lib/arm64-v8a,/vendor/lib64,/system/lib64]]]couldn'tfind"libsqlcipher.so"
解决方案:
adb root
adb push \sqlcipher\android-database-sqlcipher-4.2.0\jni\arm64-v8a\libsqlcipher.so /system/lib64/
adb push \sqlcipher\android-database-sqlcipher-4.2.0\jni\armeabi-v7a\libsqlcipher.so /system/lib/
7. python能看微信记录吗
python是一种编程语言,它看记录怎么看。应该是说能不能用它写个程序,用来看记录。这个在理论上是可以的!
8. 加密/解密Android现有的数据库使用SQLCipher问题,怎么解决
针对sqlite数据库文件,进行加密。现有两种方案如下:
1.对数据库中的数据进行加密。
2.对数据库文件进行加密
1.uin怎么获取?
这个uin不是登录的帐号,而是属于内部的、程序界面上不可见的一个编号。
至于查看,最简单的方法就是登录web微信后,按F12打开网页调试工具,然后ctrl+F搜索“uin”,可以找到一串长长的URL,里面的uin就是当前登录的微信的uin。
还
有一种方法就是配置文件里,导出的微信目录下有几个cfg文件,这几个文件里有保存,不过是java的hashmap,怎么解析留给小伙伴们自己琢磨吧,
还有就是有朋友反应退出微信(后台运行不叫退出)或者注销微信后会清空这些配置信息,所以小伙伴们导出的时候记得在微信登陆状态下导出。博主自己鼓捣了一
个小程序来完成解析。
2.一个手机多个登录帐号怎么办(没有uin怎么办)
根
据博主那个解密的帖子,必须知道串号和uin。串号好说,配置中一般都有可以搞到,uin从配置中读取出来的时候只有当前登录的或者最后登录的,其他的几
个记录都没办法解密。网上某软件的解决方法是让用户一个一个登录后再导出。这个解决方法在某些情况下是不可能的,或者有时候根本不知道uin。
后来经过一个朋友的指点,博主终于发现了解决方法,可以从配置中秒读出来这个uin,这个方法暂时不透漏了,只是说明下这个异常情况。
3.串号和uin怎么都正确的怎么还是没办法解密
先
说说串号这个玩意,几个热心的朋友反馈了这个问题,经过博主测试发现不同的手机使用的不一定是IMEI,也可能是IMSI等等,而且串号也不一定是标准的
15位,可能是各种奇葩,比如输入*#06#出来的是一个,但是在微信程序里用的却是另一个非常奇葩的东西,这种情况多在双卡双待和山寨机中出现,经过严
格的测试,现在已经能做到精确识别,那几位热心的朋友也赠与了不同的代码表示鼓励。
4.计算出来了正确的key为什么无法打开数据库文件
微
信这个变态用的不是标准的sqlite数据库,那个帖子也提到了不是数据库加密,是文件的内容加密,其实是sqlcipher。官方上竟然还卖到
149$,不过倒是开放了源码,水平够高的可以自己尝试编译。google还能搜索到sqlcipher for
windows这个很好编译,不过博主不知是长相问题还是人品问题,编译出来的无法打开微信的数据库,后来改了这份代码才完成。
5.数据库文件内容是加密的,怎么还原
这
个是某些特殊情况下用到的,比如聊天记录删除了数据库中就没了,但是某个网友测试说数据库无法查询出来了,但是在文件中还是有残留的。这个情况我没测试
过,不过想想感觉有这个可能,就跟硬盘上删除了文件其实就是删除了文件的硬盘索引,内容还是残留在硬盘上可以还原一样,sqlite数据库删除的条目只是
抹去了索引,内容还存在这个文件中。
网上的都是直接打开读取,并没有解密还原这个文件成普通的sqlite数据库,使用sqlcipher
的导出方法也只是将可查询的内容导出。后来博主花了时间通读了内容加密的方式,做了一个小程序将加密的文件内容直接解密,不操作修改任何数据,非数据库转
换,直接数据流解密,完全还原出来了原始的未加密的数据库文件,大小不变,无内容损失,可以直接用sqlite admin等工具直接打开。
6.已经删除的聊天内容可以恢复么
通过上述第5的方式还原出原数据后,经测试可以恢复。sqlite的删除并不会从文件中彻底删掉,而是抹掉索引,所以可以通过扫描原始文件恢复。前提是没有重装过微信。。。
两种加密方式的优缺点,比较如下:
一、对数据库中的数据进行加密
优点:
1.实现数据加密快速,只需添加两个方法
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据
2.程序无需进行太大变动,仅在对数据进行添加,修改,删除,查询时。针对指定的表字段进行修改进行加密,解密的字段即可。
不足:
1.由于对数据进行了加密。所以为了看到明文,必须密文进行解密。因此会增加处理器的消耗。因终端手机的处理能力有限,可能会出现处理数据缓慢的现象发生。
2.仅仅对数据进行了加密,还是可以看到数据表的sql语句,可能猜测到表的作用。另外,如果没有对一个表中的所有字段加密,则可以看没有加密的明文数据。
需要做的工作:
1.无需考虑平台差异性,qt,android,ios都能快速的实现。只需在每个平台上,使用各自的语言,实现同样的加密,解密算法即可。
2.需要对加密算法进行了解,选择一种加密算法,进行实现。
二、对数据库文件进行加密
优点:
1.对整个文件进行了加密,用户通过编辑器看不到任何有用的数据,用户使用sqlite browser软件也无法打开文件查看数据,保证了数据安全。
2.进行打开数据库时,使用程序sqlite3_key(db,”********”,8);即可对文件解密,对数据表的操作无需进行加密,采用明文即可。
不足:
1.需要修改sqlite的源代码,这个工作难度比较大。
2.需要对修改后的sqlite进行编译,需要对makefile有所了解,手动编写makefile文件,对源程序进行编译。因平台差异性,可能会造成某个平台无法编译生成动态链接库的可能。
3.需要对数据访问层代码进行修改,例如qt平台需要将以前对数据库操作使用的QSqlQuery类,更改为使用sqlite3.h文件中定义操作,对数据库操作。其他平台也一样,都要做这一步的修改。
4.在程序编译时,要加入使用加密的动态链接库(linux为共享库.so文件)windows平台最容易,只需将所使用的dll文件到应用程序中即可。其他平台需要实验,看如何引入库,如果编译。
需要做的工作:
1.修改sqlite源代码,追加对数据库文件进行加密的功能。
2.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
3.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
4.进行程序的部署,测试。
三、数据库加密原理
目前主流的数据库都采用了各种安全措施,主要包括用户认证、访问控制、数据加密存储和数据库操作审计等措施。
用户认证:用户或者程序向数据库提供自己的有效身份证明,数据库鉴别用户的身份是否合法,只有合法的用户才能存取数据
库中的数据。用户认证是所有安全机制的前提,只有通过认证才能进行授权访问和审计。
访问控制:数据库管理系统为不同的用户分配不同的权限,保证用户只能进行授权的访问。目前,一些大型数据库(如Oracle 等)
都采用了基于角色的访问控制机制,即为用户授予不同的角色,如db—owner,security administrator 等,不同的角色允许对数据库执行不同的操作。
数据库加密:用户认证以及访问控制对访问数据库进行了控制,但攻击者可能会利用操作系统或数据库漏洞,或物理接触计算机,而直接接触数据库系统文件,从而可能绕过身份认证和存取控制而直接窃取或篡改数据库内容。对数据库中的数据进行加密是防范这类威胁的有效手段。
数据库操作审计:监视和记录用户对数据库所做的各种操作的安全机制,它记录并存储用户的操作,用于事后分析,以检查导致数据库现状的原因以及提供追踪攻击者的线索。数据库的备份与恢复:当数据库发生不可恢复的故障时,可以将数据库恢复到先前的某个一致性的状态。
四、SQLite 加密
由于SQLite 是开放源码的,并且在其源码中预留了加密接口,我们可以通过实现其预留的加密接口实现口令认证和数据库加密以完善其加密机制。
1.口令认证
SQLite 数据库文件是一个普通文本文件,对它的访问首先依赖于文件的访问控制。在此基础上,再增加进一步的口令认证,即在访问数据库时必须提供正确的口令,如果通过认证就可以对数据库执行创建、查询、修改、插入、删除和修改等操作;否则,不允许进一步的访问。
9. sqlcipher android支持mip和x86架构吗
1.将sqlcipher.jar复制到工程文件夹libs中;
2.在工程main下,新建两个文件夹jniLibs和assets,将amreabi文件夹整个复制到jniLibs中,将icudt46l.zip复制到assets中;
3.加载该类
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); SQLiteDatabase.loadLibs(this); //在使用该类之前加载,而且只加载一次 }
注意导入的包为:import net.sqlcipher.database.SQLiteDatabase;
4.创建数据库的时候注意的细节
此方法无法打开数据库
database = SQLiteDatabase.openOrCreateDatabase("data", "123456", null); if (database != null) { database.execSQL("CREATE TABLE IF NOT EXISTS person_student(name VARCHAR(20) NOT NULL , age INT(3))"); }
这种才可以
File file = context.getDatabasePath("data"); file.mkdirs(); database = SQLiteDatabase.openOrCreateDatabase(file, "123456", null); // if (database != null) { database.execSQL("CREATE TABLE IF NOT EXISTS person_student(name VARCHAR(20) NOT NULL , age INT(3))"); }
比较两种方法,多了一步手动创建文件夹。
使用方法基本相同,它的加密解密都在内部完成,和我们写程序基本没关系,主要作用是防止别人通过root权限直接查看明文数据库。
10. Framework加载现有第三方JAR包或SO库
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libdatabase_sqlcipher.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/../lib //指定生成路径,默认到/system/lib64,由于是32位库,所以需重新指定
LOCAL_SRC_FILES := jniLibs/armeabi/$(LOCAL_MODULE)
#OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_LIBS :=libdatabase_sqlcipher:jniLibs/armeabi/libdatabase_sqlcipher.so
LOCAL_PREBUILT_LIBS +=libsqlcipher_android:jniLibs/armeabi/libsqlcipher_android.so
LOCAL_PREBUILT_LIBS +=libstlport_shared:jniLibs/armeabi/libstlport_shared.so
#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/../lib
include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := sqlcipher.jar
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)//最终生成在/system/framework下面
LOCAL_SRC_FILES := libs/sqlcipher.jar
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := sqlcipher:libs/sqlcipher.jar
include $(BUILD_MULTI_PREBUILT)
#LOCAL_JAVA_LIBRARIES += org.apache.http.legacy
LOCAL_JNI_SHARED_LIBRARIES := libdatabase_sqlcipher libsqlcipher_android libstlport_shared
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))