【发布时间】:2022-01-21 08:58:20
【问题描述】:
我正在尝试使用 aes 算法加密 sql 文件。我在整个互联网上看到的是只加密字符串数据或使用 sqlite 密码加密数据库中的每个数据。我想使用带有AES算法的android密码术加密数据库中的每个数据,但不添加像SQLiteCipher这样的依赖项。并将密码短语保存在外部存储中的新文件中。可以做到吗?帮帮我
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import com.example.sqlitepractise.model.Contact;
import com.example.sqlitepractise.params.Params;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import javax.crypto.NoSuchPaddingException;
public class MyDbHandler extends SQLiteOpenHelper {
public MyDbHandler(Context context){
super(context, Params.DB_NAME, null, Params.DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String create = "CREATE TABLE " + Params.TABLE_NAME + "("
+ Params.KEY_ID + " INTEGER PRIMARY KEY," + Params.KEY_NAME
+ " TEXT, " + Params.KEY_PHONE + " TEXT, " + Params.KEY_SECRET + " TEXT, " + Params.KEY_IV + " TEXT" + ")";
Log.d("practise", "Query being run is : " + create);
sqLiteDatabase.execSQL(create);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public void addContact(Contact contact){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
try {
values.put(Params.KEY_NAME, contact.getName());
values.put(Params.KEY_PHONE, contact.getPhone_number());
db.insert(Params.TABLE_NAME, null,values);
Log.d("practise", "Successfully inserted");
db.close();
// I wanted the encryption to be executed in this method
}
catch (Exception e)
{
e.printStackTrace();
}
}
public List<Contact> getAllContact(){
// I wanted the decryption to be executed in this method
List<Contact> contactList = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
//Generate the query to read from the database
String select = "SELECT * FROM " + Params.TABLE_NAME;
Cursor cursor = db.rawQuery(select, null);
//Loop Through now
if (cursor.moveToFirst()){
do {
Contact contact = new Contact();
contact.setId(Integer.parseInt(cursor.getString(0)));
contact.setName(cursor.getString(1));
contact.setPhone_number(cursor.getString(2));
contactList.add(contact);
}while (cursor.moveToNext());
}
return contactList;
}
private static int READ_WRITE_BLOCK_BUFFER = 1024;
private static String ALGO_FILE_ENCRYPTOR = "AES/CBC/PKCS5Padding";
private final static String ALGO_SECRET_KEY = "AES";
public static void encryptFile(String keyStr, String specStr,
InputStream in, OutputStream out)
throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException, InvalidKeyException,
IOException {
try{
IvParameterSpec iv = new
IvParameterSpec(specStr.getBytes("UTF-8"));
SecretKeySpec keySpec = new
SecretKeySpec(keyStr.getBytes("UTF-8"), ALGO_SECRET_KEY);
Cipher c = Cipher.getInstance(ALGO_FILE_ENCRYPTOR);
c.init(Cipher.ENCRYPT_MODE,keySpec,iv);
out = new CipherOutputStream(out, c);
int count = 0;
byte[] buffer = new byte[READ_WRITE_BLOCK_BUFFER];
while ((count = in.read(buffer))>0)
out.write(buffer,0,count);
}finally {
out.close();
}
}
}
【问题讨论】:
-
I am trying to encrypt the sql file using aes algorithm.文件就是文件。文件包含什么无关紧要。 -
encrypting only the string data or encrypting every data inside the database好吧,您可以这样做,但是您不是在加密文件,而是在加密文件中的数据。加密文件!容易得多。 -
也许您应该考虑一下您的需求 - 以加密形式存储数据很简单,但数据库旨在将存储的数据返回给用户。如果您尝试找到一个数据集,则需要解密每个数据集,将其与您的搜索模式进行比较,依此类推。通常只有敏感数据(列)需要加密(例如电话号码)。在 Android 上,如果您需要其他依赖项,它取决于目标 sdk-version。
标签: java android encryption android-sqlite aes