You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Prisma实现数据加解密?现有方案遇查询与调用难题

Prisma 敏感数据加密方案问题解答

问题背景

基于NodeJS后端,通过Prisma管理数据库,需对部分敏感数据做加密处理,尝试两种核心方案后遇到瓶颈:

  • 方案1:中间件加解密:采用AES算法可完成加解密,但无法对加密字段执行LIKE查询(比如无法按用户输入搜索商品标题)。
  • 方案2:MySQL函数加解密:函数本身逻辑可行,但通过Prisma的$queryRaw/$executeRaw调用时会报错,示例代码:
    const products = await prisma.$queryRaw`SELECT getAes(title, 'AU34chje933q') as TITLE FROM title_db.test where getAes(title, 'AU34chje933q') LIKE 'Son%'`
    

疑问:Prisma是否提供数据库数据加解密的内置方法?

解答

目前Prisma没有内置的数据库数据加解密方法,针对你遇到的两个方案问题,可参考以下优化思路:

方案1(中间件加密)的LIKE查询解决思路

若想保留中间件加密方式,可采用「双字段存储」策略:

  • 一个字段存储加密后的完整敏感数据(用于安全存储)
  • 另一个字段存储可搜索的脱敏/哈希化版本(比如对商品标题提取关键词做哈希,或保留前缀明文+后缀加密的结构)
  • 查询时针对可搜索字段执行LIKE匹配,再关联加密字段获取完整数据

方案2(MySQL函数调用报错)的排查方向

先定位报错根源,常见排查点:

  1. 确认MySQL自定义函数getAes的逻辑定义正确,且当前数据库用户有权限调用该函数
  2. 检查Prisma的数据库连接账号,确保拥有执行自定义函数的权限
  3. 先在MySQL客户端中执行该SQL语句,验证函数本身无逻辑错误
  4. 若启用Prisma类型安全,需为$queryRaw添加对应类型定义,避免类型不匹配报错

替代方案

如果以上方案无法满足需求,可考虑:

  • 在Prisma模型层封装自定义方法,将加解密逻辑嵌入模型,查询时先在应用层处理搜索关键词,再匹配加密后的数据(注意:该方式会将数据拉取到应用层处理,大数据量下性能较差)
  • 切换至支持透明数据加密(TDE)的数据库服务,由数据库层面自动完成加解密,无需在应用层额外开发

内容的提问来源于stack exchange,提问作者Alessio Ortu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:55:25