Java加密Sqlite库及文件
原因:最近在用Sqlite存储数据,因涉及数据安全,所以需要数据库加密,Sqlite库默认不带加密功能 目前已知的对 SQLite 加密的工具主要有「[SQLite Encryption Extension (SEE)]、[SQLiteEncrypt]、[SQLiteCrypt]、[SQLCipher],但是这里面仅有 SQLCipher 有免费版本。 所以自己有个方案,针对Sqlite无法就是限制不能直接查看,那就对文件进行加密,需要连接的时候进行文件解密就可以了,如果大神有更好的解决方案,请告知,谢谢!
package com.ts.tools;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import java.io.*;
/** 加密解密文件
* @author xhc
* @version 1.0.0
* @date 2022-10-31
*/
public class FileEnDe {
public static void main(String[] args) {
try {
//加密密码
String key="abcdefghijklmnop";
//FileEnDe.encryptFile("D:/test.db",key,true);
//FileEnDe.decryptFile("D:/test.db",key);
System.out.println(FileEnDe.isLocked("D:/sysDb.db"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 加密db文件(理论可以加密任何文件)
* @param filePath 文件路径
* @param key16 加密密码(必须16位)
* @return boolean
* @throws Exception
*/
public static boolean encryptFile(String filePath,String key16,boolean isReadOnly){
FileOutputStream fos =null;
boolean bFlag=false;
try {
if(FileUtil.exist(filePath)) {
byte[] key = key16.getBytes();
//取文件名称含后缀
String fileName=FileUtil.getName(filePath);
//加密文件
SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
FileInputStream fis = new FileInputStream(filePath);
String newFilePath=filePath+"_e";
fos=new FileOutputStream(newFilePath);
aes.encrypt(fis, fos, true);
fos.close();
//删除源文件,注意如果文件被使用会报:另一个程序正在使用此文件,进程无法访问
boolean isDel=FileUtil.del(filePath);
if(isDel){
//重命名加密文件为源文件
FileUtil.rename(new File(newFilePath),fileName,true);
//设置只读文件
if(isReadOnly) {
File f=new File(filePath);
f.setReadOnly();
}
}
bFlag=true;
}else{
throw new RuntimeException(filePath+" 文件不存在!");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
IoUtil.close(fos);
}
return bFlag;
}
/**
* 解密Db库
* @param filePath 文件路径
* @param key16 加密密码(必须16位)
* @return boolean
* @throws Exception
*/
public static boolean decryptFile(String filePath,String key16){
boolean bFlag=false;
FileOutputStream fos =null;
try {
if(FileUtil.exist(filePath)) {
byte[] key = key16.getBytes();
//取文件名称含后缀
String fileName=FileUtil.getName(filePath);
//解密文件
SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
FileInputStream fis = new FileInputStream(filePath);
String newFilePath=filePath+"_d";
fos = new FileOutputStream(newFilePath);
aes.decrypt(fis, fos, true);
//注意,解密之后 fos 并未关闭,请先关闭
fos.close();
//删除源文件,注意如果文件被使用会报:另一个程序正在使用此文件,进程无法访问
boolean isDel=FileUtil.del(filePath);
if(isDel){
//重命名加密文件为源文件
FileUtil.rename(new File(newFilePath),fileName,true);
}
bFlag=true;
}else{
throw new RuntimeException(filePath+" 文件不存在!");
}
} catch (FileNotFoundException e) {
throw new RuntimeException(filePath+" 文件不存在!");
}catch (Exception e){
throw new RuntimeException(e);
}finally {
IoUtil.close(fos);
}
return bFlag;
}
/**
* 文件是否占用(采用重命名的方式)
* @param filePath 文件路径
* @return boolean
*/
public static boolean isLocked(String filePath){
boolean bFlag=false;
String newFileName="";
String fileName="";
try {
if(FileUtil.exist(filePath)) {
// 采用重命名的方式,如果占用无法修改文件名称,如果未占用修改新的文件名称后再修改回来
fileName = FileUtil.getName(filePath);
newFileName = fileName + "_n";
FileUtil.rename(new File(filePath), newFileName, true);
}
} catch (Exception e) {
bFlag=true;
}finally {
//如果未占用修改新的文件名称后再修改回来
if(!bFlag) {
FileUtil.rename(new File(filePath+"_n"), fileName, true);
}
}
return bFlag;
}
}
网球女神玛利亚莎拉波娃玛丽亚莎拉波娃(MariaSharapova)在她的职业生涯中赢得了五次大满贯冠军,多次荣登世界收入最高的女运动员名单。她曾11次被福布斯杂志列为收入最高的女运动员。在其职业生涯中
美若没有几分遗憾,如何能有千般滋味美若没有几分遗憾,如何能有千般的滋味。题记今天偶然看到一篇关于遗憾的辩论赛,正方观点从未在一起更遗憾反方观点最终没有在一起更遗憾。那么很现实的两个辩论话题,其实我们大多数人都明白,
请问你有什么遗憾吗?初冬的上海,天空飘起了雪花。洋洋洒洒的雪花,似乎讲述着一篇浩瀚巨著,也是一个人不平凡的一生。天使问在空中的他Doyouhaveanyregrets?他是懂多种语言的,英语俄语歌都是
散文作品荐读凤山县巴腊猴山凤山县巴腊猴山为了四年的辉煌,换得余生的颠沛流离文初林吃了一顿丰盛的早餐之后,我们乘坐专车出发了,沿着崎岖蜿蜒的山路直奔猴山,车窗外不断闪现着青山绿水让人惊艳的壮美。通往猴山的路比
韩国球员曹圭成8件事!外表神似朴叙俊差点因身高而放弃足球2022世界杯2022世足小组赛即将进入尾声,而韩国在小组赛时遇上迦纳,其中9号球员曹圭成3分钟连进2球的好表现,不只引起球坛关注,神似朴叙俊的帅气外貌,更是在网上引起热议,IG粉
90后的10年心路历程从无知无畏少年文青愤青而立年(1)说起十年,一瞬间想到黄庭坚的诗桃李春风一杯酒,江湖夜雨十年灯!李太白曾说夫天地者,万物之逆旅光阴者,百代之过客。而浮生若梦,为欢几何?十年光阴放在人类历史长河中,弹指一瞬间放在人类
小鹏汽车打出自救组合牌,但穿越寒冬仍需时日丨焦点分析文丨彭苏平编辑丨李勤销量一早曝光之后,小鹏汽车三季度财报的不好看理应落在预期之内营收68。2亿元,环比下跌8。2,亏损略有收窄,仍高达23。8亿元但产品切换期的阵痛还是来得如此真切
今年流行的奶奶鞋,配卡布里裤简直天生一对!小个子穿也适合小个子的穿搭总是充满讲究,尤其是身材比例不够好的小个子,在穿衣方面更应该注意比例的改善。裤子和鞋子的选择是非常重要的部分,今年流行的单品是奶奶鞋和卡布里裤,这两件单品组合起来,是非
国际足联改变规则,让世界杯比赛频繁爆冷,并不是意外2022世界杯卡塔尔世界杯小组赛的比赛,很快就会结束争夺,最终晋级到16强的球队,和球迷之前的预想有很大不同,皆因这届世界杯和以往有很大不同,那就是爆冷的比赛很多,强队不强,弱队不
恶意抢注世界杯商标,就该被严打新京报快评卡塔尔世界杯吉祥物拉伊卜的周边产品。资料图。图ICphoto四年一度的世界杯,让很多人看到了商机,但也让一些人动了歪心思。据央视新闻报道,少数企业自然人以谋取不当利益为目的,对著名
分析满足湖人三种交易策略的三笔方案威少贝弗利孰去孰留?(原文发表于12月2日,作者为露天看台的DanFavale,文章内容不代表译者观点)围绕湖人的交易讨论又开始了,多方消息源告知TheAthletic网站的记者JovanBuha,湖