android本地数据加密

本文详细阐述了如何使用手机UUID作为密钥对Android设备上的本地数据进行加密,以确保数据文件不可修改和覆盖。通过加密和解密方法,结合SharedPreferences进行数据存储,实现了在运行时的数据保护。即便加密算法被破解,由于密钥的独特性,修改后的数据文件将无法被正确读取。

这篇文章主要介绍怎么对本地数据进行加密,可以做到本地数据文件不可修改,不可覆盖。

1.思路:主要思路是利用手机的uuid做密钥,来生成加密后的数据。获取本地数据的时候再根据uuid来解密。因为uudi的不同造成了即使加密算法即使被破解了,你修改了数据文件后在运行时读取数据的时候也会因为密钥的不同得不到正确的数据。

2.做法:

/*

* 加密

*/

public String encrypt(String seed, String cleartext) {

if (!(“”.equals(seed)) && !(“”.equals(cleartext))) {

byte[] rawKey;

try {

rawKey = getRawKey(seed.getBytes());

byte[] result = encrypt(rawKey, cleartext.getBytes());

return toHex(result);

} catch (Exception e) {

e.printStackTrace();

}

}

return null;

}

 

/*

* 解密

*/

public String decrypt(String seed, String encrypted) {

if (!(“”.equals(seed)) && !(“”.equals(encrypted))) {

byte[] rawKey;

try {

rawKey = getRawKey(seed.getBytes());

byte[] enc = toByte(encrypted);

byte[] result = decrypt(rawKey, enc);

return new String(result);

} catch (Exception e) {

e.printStackTrace();

}

}

return null;

}

3:用法:

/**

* 设置加密属性

* @param sKey

* @param sValue

*/

public void setStringPrefSec(String sKey, String sValue){

SharedPreferences pref = getApplicationContext().getSharedPreferences(PREFER_FILE, 0);

Editor edit = pref.edit();

edit.putString(sKey, encryption.encrypt(getUUID(), sValue));

edit.commit();

}

/**

* 获取加密属性并解密

* @param sKey

* @param sDefaultV 默认值

* @return

*/

public String getStringPrefSec(String sKey, String sDefaultV){

SharedPreferences pref = getApplicationContext().getSharedPreferences(PREFER_FILE, 0);

String sTemp = pref.getString(sKey, encryption.encrypt(getUUID(), sDefaultV));

sTemp = encryption.decrypt(getUUID(), sTemp);

return sTemp;

}

4:效果:

### Android本地数据加密存储方法 在Android平台上实现数据的本地加密存储,可以采用多种方式来确保数据的安全性。以下是一些常用的方法以及其实现细节: #### 1. 使用SharedPreferences并结合加密 SharedPreferences 是一种轻量级的键值对存储方式,但其默认情况下并不提供加密功能。为了增强安全性,可以在存储和读取数据时使用加密算法[^1]。 ```java import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; public class EncryptedSharedPreferences { private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; private static final String ALGORITHM = "AES"; public static String encrypt(String data, SecretKey secretKey, IvParameterSpec iv) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); return Base64.encodeToString(cipher.doFinal(data.getBytes()), Base64.DEFAULT); } public static String decrypt(String encryptedData, SecretKey secretKey, IvParameterSpec iv) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); return new String(cipher.doFinal(Base64.decode(encryptedData, Base64.DEFAULT))); } } ``` 通过自定义加密逻辑,将敏感数据加密后再存储到 SharedPreferences 中。 #### 2. 使用Room数据库并结合加密 Room 是 Android 官方推荐的持久化库,支持 SQLite 数据库操作。为了保护数据库中的数据,可以使用 Jetpack 提供的 `EncryptedSharedPreferences` 和 `SQLiteCipher`。 ```java import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.room.migration.Migration; import android.content.Context; @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); private static volatile AppDatabase INSTANCE; public static AppDatabase getInstance(Context context, SecretKey key) { if (INSTANCE == null) { synchronized (AppDatabase.class) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "app_database") .openHelperFactory(new SupportSQLiteEncryptOpenHelper.Factory(key)) .build(); } } } return INSTANCE; } } ``` 通过上述代码,可以实现对 Room 数据库加密存储[^1]。 #### 3. 利用NDK开发SO文件存放密钥 NDK 开发的 `.so` 文件可以用来存放一些重要的数据,如密钥、私钥等。建议将密钥分段存放,分别存放在 C 层(`.so` 文件)、`string.xml` 文件和 `gradle` 文件中,在使用时再进行拼接合并[^1]。 ```cpp // C++代码示例:生成部分密钥片段 extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapp_NativeLib_getKeySegment(JNIEnv *env, jobject /* this */) { std::string keySegment = "part_of_key"; return env->NewStringUTF(keySegment.c_str()); } ``` 通过这种方式,可以有效防止反编译工具直接获取完整的密钥信息[^1]。 #### 4. 使用Android Keystore系统 Android Keystore 系统允许应用程序生成和存储加密密钥,并以安全的方式使用这些密钥。它可以确保即使设备被 root,攻击者也无法轻易获取密钥。 ```java import java.security.KeyStore; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class KeyStoreManager { private static final String KEYSTORE_PROVIDER = "AndroidKeyStore"; private static final String ALIAS = "my_key_alias"; public static void generateKey(Context context) throws Exception { KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER); keyStore.load(null); if (!keyStore.containsAlias(ALIAS)) { KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, KEYSTORE_PROVIDER); keyGenerator.init(new KeyGenParameterSpec.Builder(ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) .build()); keyGenerator.generateKey(); } } public static Cipher initCipher(int mode) throws Exception { KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER); keyStore.load(null); SecretKey secretKey = (SecretKey) keyStore.getKey(ALIAS, null); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); cipher.init(mode, secretKey); return cipher; } } ``` 通过 Android Keystore 系统生成和管理密钥,可以显著提高数据加密的安全性[^1]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值