加密 Room 数据库的特定列
Encrypt specific column of Room database
我有一个 table 聊天应用程序中的消息,我想在我的房间数据库中 table 的列正文中使用 TripleDes 加密。我现在做的是,每当我有一组新消息时,我循环遍历它们并将 .body 字段更改为 TripleDes.encrypt(body)
// TripleDes encryption to inserted messages
messageDtoList.forEach {
if (it.body.isNotEmpty())
it.body = TripleDesEncrypt.encrypt(it.body, Params.TRIPLE_DES_KEY)
}
AppDatabase.invoke(MyApplication.instance).messageDao().insert(messageDtoList)
我想知道是否有更好更正式的方式来做到这一点
使用 TypeConverter
可能会有用。我写了一个名为 DecryptedString
的 class,它包装了 String 和内部 Converter class,它处理 encryption/decryption 个进程。
class DecryptedString(var value: String = "") {
class Converter {
@TypeConverter
fun decrypt(encrypted: String): DecryptedString {
return DecryptedString(TripleDesEncrypt.decrypt(encrypted, Params.TRIPLE_DES_KEY))
}
@TypeConverter
fun encrypt(decrypted: DecryptedString): String {
return TripleDesEncrypt.encrypt(decrypted.value, Params.TRIPLE_DES_KEY)
}
}
}
然后在 body
字段中使用 String
类型,您必须在 MessageModel
class.[=18= 中使用 DecryptedString
类型]
@Entity
data class MessageModel(
@PrimaryKey
var uid: Int,
@TypeConverters(DecryptedString.Converter::class)
@ColumnInfo(name = "decrypted_body")
var body: DecryptedString
//Other fields
)
我有一个 table 聊天应用程序中的消息,我想在我的房间数据库中 table 的列正文中使用 TripleDes 加密。我现在做的是,每当我有一组新消息时,我循环遍历它们并将 .body 字段更改为 TripleDes.encrypt(body)
// TripleDes encryption to inserted messages
messageDtoList.forEach {
if (it.body.isNotEmpty())
it.body = TripleDesEncrypt.encrypt(it.body, Params.TRIPLE_DES_KEY)
}
AppDatabase.invoke(MyApplication.instance).messageDao().insert(messageDtoList)
我想知道是否有更好更正式的方式来做到这一点
使用 TypeConverter
可能会有用。我写了一个名为 DecryptedString
的 class,它包装了 String 和内部 Converter class,它处理 encryption/decryption 个进程。
class DecryptedString(var value: String = "") {
class Converter {
@TypeConverter
fun decrypt(encrypted: String): DecryptedString {
return DecryptedString(TripleDesEncrypt.decrypt(encrypted, Params.TRIPLE_DES_KEY))
}
@TypeConverter
fun encrypt(decrypted: DecryptedString): String {
return TripleDesEncrypt.encrypt(decrypted.value, Params.TRIPLE_DES_KEY)
}
}
}
然后在 body
字段中使用 String
类型,您必须在 MessageModel
class.[=18= 中使用 DecryptedString
类型]
@Entity
data class MessageModel(
@PrimaryKey
var uid: Int,
@TypeConverters(DecryptedString.Converter::class)
@ColumnInfo(name = "decrypted_body")
var body: DecryptedString
//Other fields
)