KtORM 中实现类似 Hibernate 的字段加密转换功能
在数据库应用开发中,数据加密是一个常见的安全需求。本文将介绍如何在 KtORM 框架中实现类似 Hibernate 的 @ColumnTransformer 功能,用于对数据库字段进行透明加密和解密操作。
背景与需求
在实际项目中,我们经常需要对敏感数据进行加密存储。在 PostgreSQL 数据库中,可以使用内置的 pgp_sym_encrypt 和 pgp_sym_decrypt 函数进行对称加密。Hibernate 通过 @ColumnTransformer 注解可以方便地实现这一功能:
@ColumnTransformer(
read = "pgp_sym_decrypt(field, current_setting('encrypt.key'))",
write = "pgp_sym_encrypt(?, current_setting('encrypt.key'))"
)
而在 KtORM 中,我们需要找到对应的实现方式。
解决方案一:自定义 SqlType
KtORM 提供了自定义 SqlType 的能力,我们可以通过实现 SqlType 接口来封装加密解密逻辑:
object EncryptedStringSqlType : SqlType<String>(Types.VARCHAR, "varchar") {
override fun doSetParameter(ps: PreparedStatement, index: Int, parameter: String) {
val encrypted = encrypt(parameter) // 实现加密逻辑
ps.setString(index, encrypted)
}
override fun doGetResult(rs: ResultSet, index: Int): String? {
val encrypted = rs.getString(index)
return decrypt(encrypted) // 实现解密逻辑
}
}
// 在实体类中使用
@Table
interface User : Entity<User> {
@Column(sqlType = EncryptedStringSqlType::class)
val sensitiveData: String
}
这种方式的优点是将加密解密逻辑完全封装在 Kotlin 代码中,与数据库无关。但缺点是如果加密密钥存储在数据库中(如 PostgreSQL 的 current_setting),则无法直接使用。
解决方案二:使用 FunctionExpression
对于需要数据库端加密的场景,KtORM 提供了 FunctionExpression 来构造 SQL 函数调用。我们可以创建辅助函数来简化使用:
// 解密函数
fun pgpSymDecrypt(column: ColumnDeclaring<String>): FunctionExpression<String> {
return FunctionExpression(
functionName = "pgp_sym_decrypt",
arguments = listOf(
column.asExpression(),
FunctionExpression(
functionName = "CURRENT_SETTING",
arguments = listOf(ArgumentExpression("encrypt.key", VarcharSqlType)),
sqlType = VarcharSqlType
)
),
sqlType = VarcharSqlType
)
}
// 加密函数
fun pgpSymEncrypt(value: String): FunctionExpression<String> {
return FunctionExpression(
functionName = "pgp_sym_encrypt",
arguments = listOf(
ArgumentExpression(value, VarcharSqlType),
FunctionExpression(
functionName = "CURRENT_SETTING",
arguments = listOf(ArgumentExpression("encrypt.key", VarcharSqlType)),
sqlType = VarcharSqlType
)
),
sqlType = VarcharSqlType
)
}
使用示例:
// 查询时解密
database.from(Users)
.select(Users.id, pgpSymDecrypt(Users.sensitiveData).aliased("decrypted"))
.forEach { row ->
val decrypted = row.getString("decrypted")
// 处理解密后的数据
}
// 插入时加密
database.insert(Users) {
set(it.sensitiveData, pgpSymEncrypt("要加密的数据"))
}
方案对比与选择
-
自定义 SqlType:
- 优点:透明化处理,业务代码无需关心加密细节
- 缺点:需要在应用层实现加密逻辑,无法利用数据库内置函数
-
FunctionExpression:
- 优点:可以利用数据库内置加密函数,密钥管理在数据库端
- 缺点:需要显式调用辅助函数,代码稍显冗长
根据具体场景选择合适方案。如果加密逻辑简单且不依赖数据库特性,推荐使用自定义 SqlType;如果需要利用数据库内置加密功能,则应选择 FunctionExpression 方案。
总结
KtORM 虽然不像 Hibernate 那样提供直接的注解支持字段转换,但通过自定义 SqlType 或 FunctionExpression 也能实现类似的功能。这两种方法各有优劣,开发者可以根据项目具体需求选择最适合的方案。
对于需要高度透明化的场景,可以进一步封装,创建自定义的 Column 实现或扩展函数,使 API 更加友好。KtORM 的灵活架构为各种定制需求提供了充分的可能性。
PaddleOCR-VLPaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00- DDeepSeek-OCR暂无简介Python00
openPangu-Ultra-MoE-718B-V1.1昇腾原生的开源盘古 Ultra-MoE-718B-V1.1 语言模型Python00
HunyuanWorld-Mirror混元3D世界重建模型,支持多模态先验注入和多任务统一输出Python00
AI内容魔方AI内容专区,汇集全球AI开源项目,集结模块、可组合的内容,致力于分享、交流。03
Spark-Scilit-X1-13BFLYTEK Spark Scilit-X1-13B is based on the latest generation of iFLYTEK Foundation Model, and has been trained on multiple core tasks derived from scientific literature. As a large language model tailored for academic research scenarios, it has shown excellent performance in Paper Assisted Reading, Academic Translation, English Polishing, and Review Generation, aiming to provide efficient and accurate intelligent assistance for researchers, faculty members, and students.Python00
GOT-OCR-2.0-hf阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00- HHowToCook程序员在家做饭方法指南。Programmer's guide about how to cook at home (Chinese only).Dockerfile013
Spark-Chemistry-X1-13B科大讯飞星火化学-X1-13B (iFLYTEK Spark Chemistry-X1-13B) 是一款专为化学领域优化的大语言模型。它由星火-X1 (Spark-X1) 基础模型微调而来,在化学知识问答、分子性质预测、化学名称转换和科学推理方面展现出强大的能力,同时保持了强大的通用语言理解与生成能力。Python00- PpathwayPathway is an open framework for high-throughput and low-latency real-time data processing.Python00