Зашифровать указанный c столбец базы данных комнат - PullRequest
1 голос
/ 15 января 2020

У меня есть таблица с сообщениями в приложении чата, и я хочу использовать шифрование TripleDes в теле столбца таблицы в моей базе данных комнат. Что я делаю сейчас, так это то, что всякий раз, когда я получаю через них массив новых сообщений il oop и меняю поле .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)

, я хотел узнать, есть ли лучший и более формальный способ сделать это

1 Ответ

3 голосов
/ 15 января 2020

Использование 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
)
...