sqlcipher java_纯java环境下sqlsqlcipher解密sqlite数据库文件
由于工作需要,最近一周以來研究sqlite數據庫文件的解密方法。最終采用sqlcipher工具進行解密。由于sqlcipher的實現大多是支持android的,修改為純java平臺下的代碼有難度,因此選擇了通過sqlcipher腳本執行解密的方案。從調研到最終發布,共嘗試了ubuntu,windows8, centos7這三種系統下的解密。
sqlcipher解密命令:
>>sqlcipher test.db ? ?//連接數據庫
>>pragma key = "123"; ? //密鑰
>>.tables ? //查看當前數據庫下的所有表
ubuntu:
1.sqlcipher軟件安裝。
apt-get install sqlcipher ? ?即可完成。
2.編寫.sh腳本,通過附加數據庫的方式導出解密后的數據庫。
#!/bin/sh
#文件路徑
path=$1;
#文件名
fileName=$2
#密鑰
key=$3;
#導出文件名
outName=$4
echo "=======開始解密=========";
echo "輸入參數為:"${path}" "${fileName}" "${key}" "${outName}
temp="\""${path}${outName}".db""\"";
temp2="('"${outName}"')";
#echo "導出文件路徑:"${temp};
#如果導出文件已存在,則刪除
outPath=${path}${outName}".db";
if [ -f $outPath ]
then echo "導出文件已存在,將會覆蓋!";
rm -rf $outPath;
fi
#執行sqlcipher命令
echo "開始執行sqlcipher命令"
sqlcipher ${path}${fileName} << EOF;
PRAGMA key = ${key};
attach database ${temp} as ${outName} key '';
select sqlcipher_export ${temp2};
detach database ${outName};
EOF
echo "=======解密完成=======";
windows8
1.下載sqlcipher.exe文件。
2.編寫.bat腳本,導出解密后的數據庫
@echo off
::文件路徑
set filePath=%1
::文件名
set fileName=%2
::密鑰
set key=%3
::導出文件名
set outName=%4
::sqlcipher.exe文件的路徑
set exePath=%5
echo ===============STARTING DECRYPT=============
echo Input_Params:%filePath% %fileName% %key% %outName% %exePath%
set temp='%filePath%%outName%.db'
set temp2=('%outName%')
echo Output_File_Path:%temp%
::如果導出文件已存在,則刪除
set outPath=%filePath%%outName%.db
if exist %outPath% (
echo Output File is Exist, Will Overrite It!
del %outPath%
)
::執行sqlcipher命令
echo Run the Sqlcipher Commands
echo Current_Database:%filePath%%fileName%
%exePath% %filePath%%fileName% "PRAGMA key = %key%;attach database %temp% as %outName% key '';select sqlcipher_export %temp2%;detach database %outName%;"
echo ================FINISH DECRYPT==============
exit;
centos7
1.下載sqlcipher源碼,編譯之后會在sqlcipher文件夾下生成可執行文件sqlcipher.sh文件。
% git clone git://github.com/sqlcipher/sqlcipher.git
% cd sqlcipher
% ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
% make
2.測試
./sqlcipher test.db
其余見sqlcipher解密命令
java代碼中調用.sh或.bat腳本
linux環境:
public static void execLinux(String cmd) throws Exception {
String[] cmdA = { "/bin/sh", "-c", cmd };
Process process = Runtime.getRuntime().exec(cmdA);
process.waitFor();
// 獲取返回結果
LineNumberReader br = new LineNumberReader(new
InputStreamReader(process.getInputStream(),"UTF-8"));
String line;
while ((line = br.readLine()) != null) {
log.info(line);
}
}
windows環境:
public static void execWindows(String cmd) throws Exception {
Process process = Runtime.getRuntime().exec("cmd.exe /c start /b " + cmd);
process.waitFor();
// 獲取返回結果
LineNumberReader br = new LineNumberReader(new
InputStreamReader(process.getInputStream(),"UTF-8"));
String line;
while ((line = br.readLine()) != null) {
log.info(line);
}
}
總結
以上是生活随笔為你收集整理的sqlcipher java_纯java环境下sqlsqlcipher解密sqlite数据库文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代计划在韩国新建一座电动汽车工厂,投资
- 下一篇: 民间传说的故事20个推荐