当前位置: 首页 > news >正文

UniDAC使用教程(五):数据加密

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

下载UniDAC最新版本

Universal Data Access Components (UniDAC)是一款通用数据库访问组件,提供了多个数据库的直接访问,如针对Windows的Delphi, C++Builder, Lazarus (以及 Free Pascal) , Mac OS X, iOS, Android, Linux和64和32位的FreeBSD等等。我们将长期的经验集于这个小组件,提供统一的数据库连接访问(如oracle、微软SQL等等)。这意味着您可以在您的项目之间轻松地切换不同的数据库,以及创建跨数据库应用程序接口。

UniDAC拥有内置的数据加密和解密算法。要启用加密,应将TCREncryptor组件附加到数据集,并指定加密字段。在表中插入或更新数据时,将按照指定的方法在客户端加密信息。同样,当从服务器读取数据时,组件会“即时”解密这些字段中的数据。

对于加密,您应该指定数据加密算法(EncryptionAlgorithm属性)和密码(Password属性)。根据指定的密码生成密钥,对数据进行加密。也可以使用SetKey方法直接设置密钥。

存储加密数据时,除了初始数据外,还可以存储其他信息:GUID和散列。(方法在TCREncryptor.DataHeader属性中指定)。

如果数据存储时没有附加信息,则无法确定数据是否加密。在这种情况下,只应将加密的数据存储在列中,否则,由于无法区分数据的性质,会出现混淆。同样,从信息保护的角度来看,类似的源数据将以加密的形式等价,这是不好的。这种方法的优点是初始数据的大小等于加密数据的大小。

为了避免这些问题,建议与数据一起存储适当的GUID,这对于指定记录中的值是加密的,并且在读取数据时必须对其进行解密是必需的。这允许您避免混淆并将加密和解密的数据保存在同一列中,这在使用现有表时尤为重要。同样,这样做时,在数据加密之前会生成一个随机初始化向量,用于加密。这允许您接收相同初始数据的不同结果,从而显著提高了安全性。

最可取的方法是存储哈希数据以及GUID和加密信息,以确定数据的有效性并验证其完整性。这样,如果在传输或数据存储的任何阶段试图伪造数据,在解密数据时,都会产生相应的错误。为了计算散列,可以使用SHA1或MD5算法(HashAlgorithm属性)。

后两种方法的缺点是存储辅助信息需要额外的内存。

由于加密算法使用一定大小的缓冲区,并且在存储附加信息时,需要使用附加内存,因此TCREncryptor仅支持对字符串或二进制字段(ftString、ftWideString、ftBytes、ftvarBytes、ftBlob、ftMemo、ftWideMemo)进行加密。如果使用字符串字段加密,首先对数据进行加密,然后将获得的二进制数据转换为十六进制格式。在这种情况下,数据存储需要两倍的空间(一个字节=2个十六进制字符)。

因此,为了能够加密其他数据类型(如日期、数字等),需要在表中创建二进制或blob类型的字段,然后在数据映射的帮助下将其转换为客户机端的所需类型。

需要注意的是,在服务器端不可能通过加密字段进行搜索和排序。只有在使用Locate和LocaTex方法对数据进行解密之后,才能在客户端上对这些字段执行数据搜索。排序是通过设置TMemDataSet.IndexFieldNames属性来执行的。

例如:

例如,表中存储了一个企业的员工列表,其中包含以下数据:全名、雇用日期、工资和照片。我们希望所有这些数据都以加密形式存储。编写用于创建表的脚本:

1

2

3

4

5

6

CREATE TABLE EMP (

EMPNO varbinary IDENTITY (1,1) NOT NULL PRIMARY KEY,

ENAME varbinary (2000),

HIREDATE varbinary (200),

SAL varbinary (200),

FOTO VARBINARY);

如我们所见,文本信息、日期和浮点数的存储字段是用VARBINARY类型创建的。这是为了能够存储加密的信息,而在文本字段的情况下——为了提高性能。编写代码在客户机上处理这些信息。

1

2

3

4

5

6

7

8

9

10

11

UniQuery.SQL.Text : = 'SELECT * FROM EMP';

 

UniQuery.Encryption.Encryptor : = UniEncryptor;

UniQuery.Encryption.Fields : = 'ENAME, HIREDATE, SAL, FOTO';

UniEncryptor.Password : = '11111';

 

UniQuery.DataTypeMap.AddFieldNameRule ('ENAME', ftString);

UniQuery.DataTypeMap.AddFieldNameRule ('HIREDATE', ftDateTime);

UniQuery.DataTypeMap.AddFieldNameRule ('SAL', ftFloat);

 

UniQuery.Open;

转载于:https://my.oschina.net/u/4009527/blog/3008839

相关文章:

  • React-生命周期杂记
  • 关于VirtualDom的知识点
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 生成、打包、部署和管理应用程序及类型(3):将模块合并成程序集
  • windows下使用nginx调试简介
  • Ajax 知识
  • 什么软件可以提取视频中的音频制作成手机铃声
  • TypeScript(ES6) 的一些使用的小技巧
  • git远程分支回退
  • 开源SQL-on-Hadoop系统一览
  • Terraform入门 - 3. 变更基础设施
  • 【刷算法】LeetCode-26.删除排序数组中的重复项
  • SpiderData 2019年2月16日 DApp数据排行榜
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Apache Pulsar 2.1 重磅发布
  • Effective Java 笔记(一)
  • es6--symbol
  • HTTP中GET与POST的区别 99%的错误认识
  • mysql innodb 索引使用指南
  • mysql外键的使用
  • springboot_database项目介绍
  • SpringBoot几种定时任务的实现方式
  • Vue 重置组件到初始状态
  • Vultr 教程目录
  • 电商搜索引擎的架构设计和性能优化
  • 订阅Forge Viewer所有的事件
  • 后端_MYSQL
  • 机器学习中为什么要做归一化normalization
  • 基于 Babel 的 npm 包最小化设置
  • 入口文件开始,分析Vue源码实现
  • 译有关态射的一切
  • 与 ConTeXt MkIV 官方文档的接驳
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #### go map 底层结构 ####
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (06)金属布线——为半导体注入生命的连接
  • (3)(3.5) 遥测无线电区域条例
  • (4)logging(日志模块)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Java)【深基9.例1】选举学生会
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (算法设计与分析)第一章算法概述-习题
  • (转)jdk与jre的区别
  • (转)scrum常见工具列表
  • .net framework profiles /.net framework 配置
  • .NET 中的轻量级线程安全
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @RestController注解的使用
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...