自托管Microsoft Dynamics CRM 2016是否支持数据库级自定义字段加密
结论
需求完全可以实现,仅针对自定义字段做SQL内置对称加密不会破坏Dynamics CRM 2016自托管版本的正常运行。
实现前提
你使用的是本地自托管部署的非Online版本,拥有SQL Server数据库的完全操作权限,这是使用SQL原生加密方案的基础,Online版本因为不开放底层数据库权限无法采用该方案,但你的部署环境完全满足要求。
关键实现步骤
- 第一步先定位自定义字段对应的数据库存储位置:Dynamics CRM的所有自定义字段都会同步到对应实体的
[实体名]Base表中,比如你在联系人实体新建的自定义敏感字段new_idcard,对应就是ContactBase表中的new_idcard字段。如果加密后存储的是varbinary类型的密文,建议你直接在CRM中新建类型为「二进制」的自定义字段存储密文,不要直接修改原有文本类型自定义字段的数据库属性,避免触发CRM元数据校验错误。 - 第二步配置SQL对称加密:按标准SQL Server对称加密流程操作即可,示例流程如下:
-- 创建数据库主密钥 CREATE MASTER KEY ENCRYPTION BY PASSWORD = '你设置的强密码'; -- 创建加密用证书 CREATE CERTIFICATE CRM_Sensitive_Cert WITH SUBJECT = 'CRM敏感字段加密证书'; -- 创建对称密钥 CREATE SYMMETRIC KEY CRM_Sensitive_Key WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE CRM_Sensitive_Cert;
加密字段调用EncryptByKey(Key_GUID('CRM_Sensitive_Key'), '明文内容')即可,解密用CONVERT(nvarchar(255), DecryptByKey(密文字段))转换为明文。
- 第三步做CRM读写逻辑适配:因为数据库层面存的是密文,直接返回给CRM前端会显示乱码,你需要分别注册两个CRM插件:
- 预创建、预更新插件:在数据写入数据库之前,把用户输入的明文敏感内容用SQL加密函数处理成密文再存入对应字段
- 预检索插件:在数据从数据库读出返回给前端之前,调用SQL解密函数把密文转成明文,前端用户感知不到加密逻辑的存在,原有表单、视图、报表都可以正常使用。
注意事项
- 所有操作仅可针对你自行创建的自定义字段,禁止修改CRM系统原生字段的属性、存储内容,否则会导致CRM系统更新、补丁安装失败,严重时会触发元数据异常导致对应实体不可用。
- 数据库主密钥、证书、对称密钥一定要单独离线备份,不要和CRM数据库、服务器存储在同一环境,一旦密钥丢失所有加密的敏感数据将无法恢复。
- 加密后的密文字段无法直接用于数据库层面的模糊检索、排序操作,如果有这类需求,建议额外存储该字段的加盐哈希值用于等值检索,不要直接对密文做筛选操作。
内容的提问来源于stack exchange,提问作者ichachan
相关产品推荐
相关产品推荐

