android - 加密Room数据库的特定列

标签 android kotlin android-room tripledes

我在聊天应用程序中有一个带有消息的表,我想在“房间数据库”中该表的列主体中使用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的类,该类包装了String和用于处理加密/解密过程的内部Converter类。

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)
        }
    }
}

然后,必须在String类中使用body类型,而不是对DecryptedString字段使用MessageModel类型。

@Entity
data class MessageModel(
        @PrimaryKey
        var uid: Int,

        @TypeConverters(DecryptedString.Converter::class)
        @ColumnInfo(name = "decrypted_body")
        var body: DecryptedString

        //Other fields
)

关于android - 加密Room数据库的特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750299/

相关文章:

Android 当插入数据不存储到数据库中时

java - 每次都需要重建项目以反射(reflect) Android Studio Chipmunk 中的变化

java - 卡住了设置 Room 以与 RxJava 一起使用 : access to database may potentially lock the UI

android - 为什么有时需要在列表中使用 key() ?

java - 为什么我无法通过 setOnClickListener 从程序中获取任何其他输出?

java - Eclipse中的Kotlin和Java项目,NoClassDefFoundError,类文件在哪里?

android - 选择房间db kotlin中的查询?

android - 通过Kotlin使用Intent Extras获取房间数据

javascript - Protractor - 如何生成执行报告或在输出文本文件中显示 console.log 消息

kotlin - 如何在Kotlin中声明静态属性?