65.9K
CodeProject 正在变化。 阅读更多。
Home

一次编写,在 Windows、Mac、Linux、Solaris、Android 和 iOS 上测试加密数据存储

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014 年 4 月 16 日

CPOL

8分钟阅读

viewsIcon

19159

downloadIcon

87

一次编写,在 Windows、Mac、Linux、Solaris、Android 和 iOS 上测试加密数据存储

如何让我们的开发者生活更轻松!

越来越多的移动应用程序需求导致为每个平台开发原生应用程序,这有多种原因,包括

  • 速度
  • 性能
  • 可用性

还有一个越来越重要的方面是,随着越来越多的企业转向移动化其劳动力,这便是

  • 安全性。

总而言之,这里的关键在于加密!然而,挑战在于如何在多个平台上轻松实现这一点,并为我们开发者带来便利,为我们编写代码的对象带来安全。

我们都知道这个挑战的理想答案是

  • 一次编写,一次测试,然后在多个平台上部署。

InterBase 为开发者和企业提供了这种正是所需的功能,这一点我们将在本文中进行探讨。

但首先,让我们先解决一个问题。

  • 我们应该在应用程序中使用本地数据吗?

虽然这超出了本文的范围(并在该白皮书中 http://embt.co/MobEntData 有深入探讨),但简短的答案是肯定的!我敢肯定我们都在手机上使用电子邮件;我们希望无论身在何处,无论是在火车上、飞机上、高耸的混凝土建筑中等,电子邮件都能正常工作。简而言之,无处不在。没有离线数据,这一切是不可能的。例如,即使是 Facebook,也允许您离线创建和查看帖子!

数据层中的安全性 == 一切顺利!

在开始编写代码之前,我想简要提及一下数据在产品生命周期中的作用。设备上的数据只是我们在构建和开发移动应用程序时需要考虑的一部分。数据的定义及其使用方式可能会随着需求的收集而改变。这给重构带来了很大的风险,也给开发和测试团队带来了额外的压力和责任。

解决方案很简单,并且具有一个很好的副作用,那就是大大降低了出错的可能性 = 减轻压力 = 缩短上市时间。

  • 在数据层实现数据可见性规则!

虽然,例如,看到可能显示您的同事收入的数据可能很有趣,但暴露敏感数据并为此承担责任则没有那么有趣!与其让 QA 为多个平台测试相同的安全设置,不如一次性检查完毕,让产品测试人员专注于 UI 体验等其他方面会更快。(当我们在后面讨论集成基于角色的身份验证时,请牢记这一点)。

创建和加密 InterBase 数据库

现在我们有了背景知识,让我们开始看看如何加密数据库以在 Windows、Mac、iOS、Android、Linux 和 Solaris 上使用!InterBase 中的加密不仅支持数据库级别,还支持单个列级别加密 - 这对于需要为特定数据列(例如信用卡)设置单独加密密钥的情况非常重要。

在下一节中,我们将分解以下 SQL 脚本。该脚本对 InterBase 演示数据库 Employee.gdbEMPLOYEE 表中的 Salary 和 Phone Ext 字段执行了列级别加密。

/* # Enable Embedded User Authentication and create users.
   SYSDSO: for encryption management
   HR_EMP: HR Dept. employee. Privilege to see "salary" info.
   NEW_EMP: New employee. No privilege to see "salary" info.
*/
CONNECT 'c:\data\employee_col_encrypt.ib' USER 'sysdba' PASSWORD 'masterkey';
ALTER DATABASE ADD ADMIN OPTION;
CREATE USER SYSDSO SET PASSWORD 'sysdso';
CREATE USER HR_EMP SET PASSWORD 'hr_emp';
CREATE USER NEW_EMP SET PASSWORD 'new_emp';
CREATE USER SALES_EMP SET PASSWORD 'sales_emp';
COMMIT;


/* # Create encryptions */
CONNECT 'c:\data\employee_col_encrypt.ib' USER 'sysdso' PASSWORD 'sysdso';
ALTER DATABASE SET SYSTEM ENCRYPTION PASSWORD 'Secret Password';
CREATE ENCRYPTION hr_key FOR DES WITH LENGTH 56 BITS;
CREATE ENCRYPTION sales_key FOR AES WITH LENGTH 256 BITS;
/* Password protected Encryption key required for database backup */
CREATE ENCRYPTION backup_key FOR AES WITH LENGTH 256 BITS PASSWORD 'backup_password';
GRANT ENCRYPT ON ENCRYPTION backup_key TO SYSDBA;
GRANT ENCRYPT ON ENCRYPTION hr_key TO SYSDBA;
GRANT ENCRYPT ON ENCRYPTION sales_key TO SYSDBA;
COMMIT;

/* # Encrypt EMPLOYEE(SALARY) */
CONNECT 'c:\data\employee_col_encrypt.ib' USER 'sysdba' PASSWORD 'masterkey';
ALTER TABLE EMPLOYEE ALTER COLUMN SALARY ENCRYPT WITH hr_key;
ALTER TABLE EMPLOYEE ALTER COLUMN SALARY DECRYPT DEFAULT 0;
GRANT DECRYPT(salary) ON EMPLOYEE TO HR_EMP;
ALTER TABLE EMPLOYEE ALTER COLUMN phone_ext ENCRYPT WITH sales_key;
ALTER TABLE EMPLOYEE ALTER COLUMN phone_ext DECRYPT DEFAULT 0;
GRANT DECRYPT(phone_ext) ON EMPLOYEE TO SALES_EMP;
REVOKE ALL ON EMPLOYEE FROM PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE,REFERENCES ON EMPLOYEE TO PUBLIC;
COMMIT;

介绍 SYSDSO

数据加密级别的控制不应该由数据库所有者管理,绝对不应该由开发人员管理(因为风险太高,开发人员需要拥有查看受限数据的权限),而应该由数据可见性策略的所有者管理。因此,InterBase 建议使用 SYSDSO(数据安全官)作为管理安全的登录。

该脚本首先在数据库中创建 SYSDSO(这需要启用管理员选项/嵌入式用户身份验证)。InterBase 的嵌入式用户身份验证将所有用户置于数据库文件中,以确保安全性在整个开发生命周期中都可以迁移)。

CONNECT 'c:\data\employee_col_encrypt.ib' USER 'sysdba' PASSWORD 'masterkey';


ALTER DATABASE ADD ADMIN OPTION;
CREATE USER SYSDSO SET PASSWORD 'sysdso';


创建和管理用户

该脚本还(为此演示目的)创建了两个新的数据库用户:HR_EMPNEW_EMP。HR 员工可以查看工资信息,而新员工用户则无权查看这些数据,而应返回一个默认值(我们稍后会介绍)。

CREATE USER HR_EMP SET PASSWORD 'hr_emp';

CREATE USER NEW_EMP SET PASSWORD 'new_emp';

CREATE USER SALES_EMP SET PASSWORD 'sales_emp';


虽然这超出了本文的范围,但对于大型系统,建议以 ISO9001 为基础,您可以在 InterBase 中创建用户角色,并将用户分配给他们所扮演的角色。这为用户管理提供了极大的灵活性。

添加加密密钥

一旦用户进入数据库,脚本将继续创建将要使用的加密密钥。

/* # Create encryptions */
CONNECT 'c:\data\employee_col_encrypt.ib' USER 'sysdso' PASSWORD 'sysdso';
ALTER DATABASE SET SYSTEM ENCRYPTION PASSWORD 'Secret Password';
CREATE ENCRYPTION hr_key FOR DES WITH LENGTH 56 BITS;
CREATE ENCRYPTION sales_key FOR AES WITH LENGTH 256 BITS;
/* Password protected Encryption key required for database backup */
CREATE ENCRYPTION backup_key FOR AES WITH LENGTH 256 BITS PASSWORD 'backup_password';
GRANT ENCRYPT ON ENCRYPTION backup_key TO SYSDBA;
GRANT ENCRYPT ON ENCRYPTION hr_key TO SYSDBA;
GRANT ENCRYPT ON ENCRYPTION sales_key TO SYSDBA;
COMMIT;

InterBase 支持 DES 和 AES 强度的加密。(推荐 AES 256 位)。使用加密时,您需要创建一个备份密钥,该密钥支持数据库文件中最高级别的加密。此备份密钥无法访问数据,但允许外部脚本备份数据库。如果数据库由不需要查看数据的网络管理员备份,则此功能特别有用。

关于加密级别的一个快速说明:为符合全球数据保护要求,建议使用 AES 256 位加密对静止数据进行加密。这是 FIPS 140-2 所要求的级别,也是 ICO http://ico.org.uk 等领先组织推荐的级别。

加密特定列

在设置了数据库用户和创建了加密密钥后,现在就可以加密我们想要特定加密的数据了。这可以在数据库级别完成(例如,使用 HR 密钥)

/* # Encrypt database */
CONNECT 'c:\data\employee_col_encrypt.ib' USER 'sysdba' PASSWORD 'masterkey';
ALTER DATABASE ENCRYPT WITH hr_key; 
COMMIT;

或者在这个脚本中,在列级别完成。这比加密整个数据库要高效得多。在这两种版本中,您仍然可以拥有列级别加密,该加密会覆盖数据库级别的加密密钥,从而实现支持 PCI 合规性等内容的独特列特定加密。

/* # Encrypt EMPLOYEE(SALARY) */
CONNECT 'c:\data\employee_col_encrypt.ib' USER 'sysdba' PASSWORD 'masterkey';
ALTER TABLE EMPLOYEE ALTER COLUMN SALARY ENCRYPT WITH hr_key;
ALTER TABLE EMPLOYEE ALTER COLUMN SALARY DECRYPT DEFAULT 0;
GRANT DECRYPT(salary) ON EMPLOYEE TO HR_EMP;
ALTER TABLE EMPLOYEE ALTER COLUMN phone_ext ENCRYPT WITH sales_key;
ALTER TABLE EMPLOYEE ALTER COLUMN phone_ext DECRYPT DEFAULT 0;
GRANT DECRYPT(phone_ext) ON EMPLOYEE TO SALES_EMP;
REVOKE ALL ON EMPLOYEE FROM PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE,REFERENCES ON EMPLOYEE TO PUBLIC;
COMMIT;

您可以在上面的脚本中看到,一旦连接,SYSDSO 定义的加密级别就可以由数据库所有者在列上设置。当用户无权读取数据时,还会为列设置默认值。这非常强大,因为它确保了查询不会中断,即使您无法看到数据。在这里,我们可以看到 HR 密钥用于管理工资,销售密钥用于查看电话号码字段,如果您无权读取数据,则两者都具有默认值。虽然这不是现实生活中最好的例子,但它确实展示了即使在同一个表中,拥有不同的加密密钥和数据可见性的灵活性。

脚本的最后一部分是撤销公共访问权限,对于旧数据库,您必须在通过 grant 语句重新确认对 employee 表的访问权限之前执行此操作。就是这样!我们现在准备好观看实际效果了!

观看实际效果!

要查看此脚本的实际输出,我们将查看脚本中添加的两个用户运行的相同查询。

要观看实际效果,我将展示一个使用 RAD Studio 中的多平台原生编译器构建的 Android 和 iOS 应用程序。此处显示的示例应用程序有两个数据库连接,唯一的区别是用户名和密码,其他数据库参数完全相同。

选择加密数据

使用带有 HR_EMP 登录的第一个数据库连接,即使在设计时,我们也可以查询数据库并查看数据。(此时是在 Windows 上)。

现在,在 Android 或 iOS 上使用相同的数据文件,我们可以在运行时登录并查看相同的运行时结果。

查看加密默认值

我们运行的第二个查询与第一个查询相同,只是它通过了具有 NEW_EMP 用户(无权查看工资)的数据库连接。在 Windows 设计时,我们可以看到输出的工资为零(如脚本中定义的默认返回值)。

同样,当我们部署应用程序时,这将在运行时得到控制,而无需在应用程序层编写任何代码。

运行时

摘要

加密业务数据的静态存储对于任何应用程序的风险管理都至关重要,尤其是在移动化时。InterBase 提供了一种强大、对企业友好的方式来管理数据层中数据的加密,从而消除了开发人员在代码中管理此问题的需求。这大大降低了数据泄露的风险,而数据泄露可能导致客户流失、监管行动、罚款和额外成本;它还通过减少有关存储敏感数据的应用程序的测试开销来加速开发和测试周期。

更多关于 InterBase 的信息

有关此主题领域的完整白皮书,请访问 http://embt.co/MobEntData

本文的源代码 http://cc.embarcadero.com/Item/29624

有关 InterBase 的更多信息,请访问 http://www.embarcadero.com/products/interbase

其他教程视频
http://www.embarcadero.com/products/interbase-labs
http://www.embarcadero.com/products/interbase/product-demos

有关 InterBase 文档,请访问
http://docs.embarcadero.com/products/interbase

© . All rights reserved.