计算机应用
COMPUTER APPLICATIONS
1999年 第19卷 第6期 Vol.19 No.6 1999



Domino环境中的数据加密技术
李俊海　耿继秀　钱丽瑾　刘彦丽　张德壮
　　摘　要　在企业网络实践的基础上，讨论了数据加密技术在企业网络中的应用。为了防止对非授权的数据库和文档的存取，可以对数据库进行选择算法的加密和使用私钥/公钥加密机制，对数据库文档的字段加密。
　　关键词　数据库文档，数据加密，密钥，存取授权
1　引言
　　加密技术可以使我们在不安全的通道上建立安全的连接。在Domino环境中，为了防止对非授权的数据库、文档或者邮件的存取，除对数据库进行不同级别的授权外（七种级别），我们能够对数据库、对某个库中的一个文档、多个文档或者全部文档进行加密。通过加密的办法，使得系统中的各种数据的安全在三个面上得到保障。加密的办法有多种多样的，但是总离不开加密用的密钥。Domino提供了对称和非对称的两种加密机制。在对称的加密机制中，用户需要在阅读加密文档时具备密钥。我们着重讨论对数据库中的一般文档、对使用指定表单产生的所有文档、文档中的全部字段或部分字段使用指定密钥进行加密、对数据库进行选择算法的加密以及指定用户解密的方法和技术。
2　数据库文档加密
　　在Domino环境中，数据库是文档的集合。一个数据库可以包含最多不超过4GB大小的数据文档。对一个文档加密的含义是， 使用公钥或某个密钥应用到一个或多个的域（字段）上进行加密。如果密钥是特选的，就需要将该密钥发送给所指定的用户。拥有一个文档密钥的任何用户都可以读该文档加密域。没有密钥的用户则只可以读在该文档中没有被加密的域。对一个文档进行加密保护，它的表单必须具备一个或多个系统开发者定义的可加密的域。实际上，为了醒目起见，在填写一个文档时就可以看到加密域用红色的标记来识记。我们在对域加密时，可以使用系统为用户生成的公钥或者创建一个新的密钥。在一个文档中，对可加密的域都可使用所选定的密钥进行加密；用户不允许为某个文档的可加密域选择不同的密钥。除了对数据库中的某个文档进行加密外，我们还可以对数据库中使用特定的表单创建的全部文档加密。
　　数据库的拥有者可以对特定的表单创建的所有文档进行加密。用户可通过将密钥加入到表单中或者把相关密钥的关键字加入到该表单来达到目的。数据库的“设计者”有权决定该表单将使用何种类型和哪些密钥。如果将密钥加入到某个表单中，那么通过该表单构造的所有文档都用这个密钥加密。这里我们给出一个对数据库中全部文档使用给定密钥进行加密的例子。加密是通过LotosScript（一种类似VisualBasic面向对象的语言,功能上更强于该语言）来实现的。 以下的程序用密钥“绝密” 和“Top Secret”加密文档中的每一域。
　Dim doc As NotesDocument
′定义doc为Notes文档变量对象
　Dim item As NotesItem
′定义item为Notes文档域（或字段）变量对象
　Dim keys( 1 To 2 ) As String
′定义keys(1)和keys(2)为字符串数组
　Forall i In doc.Items
′对该文档中的所有字段对象进行初始化设置，
　i.IsEncrypted = True
′把字段对象加密属性设置为真
　End Forall
　keys( 1 ) = "绝密"
′分别对keys(1)和keys(2)赋值
　keys( 2 ) = "Top Secret" 
　doc.EncryptionKeys = keys
　Call doc.Encrypt　　　　　　　　　　　　　　　　　　　　　　　　　　′进行加密处理
　Call doc.Save( True, True )
′把经过加密处理的文档保存起来并结束加密
　　我们可以看到，程序在最后调用Save函数时才把加密文档保存好。到此为止，所有 IsEncrypted 属性为真（True）的域被加密。而那些IsEncrypted属性为假（False）的项对任何用户都是可见的，即使该用户没有正确的密钥。若用一个或多个密钥设置 EncryptionKeys 属性，则这些密钥被用来加密该文档。任何具有这些密钥中的一个的用户都可对该文档解密。若没有指定密钥，则使用用户的公钥加密该文档。
　　下面我们还给出一个对选定文档的字段进行加密的例子。加密也是用LotusScript语言来完成的。该程序在文档中加密每一域。因为没有显示地给出密钥，说明使用的是公钥，所以解密时就要用到用户自己的私钥。
　Dim doc As NotesDocument　　　　　　　　　　　　　　　　　　　′定义doc为文档对象
　Forall i In doc.Items
′对该文档中的所有域对象进行初始化设置
　i.IsEncrypted = True
′即加密属性设置为真
　End Forall
　Call doc.Encrypt　　　　　　　　　　　　　　　　　　　　　　　　　　′进行加密处理
　Call doc.Save( True, True )
′把经过加密处理的文档保存并结束加密。
　　这个加密示例与前一个的不同就是在用户没有给定特定的密钥。下面我们再给出另外一个对字段加密的例子。在该例子中，专门对指定的两个字段：Subject字段和Body字段使用“绝密”密钥进行加密。
　Dim doc As NotesDocument
Dim itemA As NotesItem
′分别定义两个域对象变量itemA和ItemB
Dim itemB As NotesItem
Set itemA = doc.GetFirstItem( "Subject" )
′对定义的两个变量赋字段值
Set itemB = doc.GetFirstItem( "Body" )
itemA.IsEncrypted = True 
′itemA和ItemB加密属性分别设置为真
itemB.IsEncrypted = True
doc.EncryptionKeys ="绝密"
Call doc.Encrypt　　　　　　　　　　　　　　　　　　　　　　　　　　　′进行加密处理
Call doc.Save( True, True )
′把经过加密处理的文档保存起来并结束加密。
　　如果某个用户希望对数据库中选定的文档进行加密，就需要具备“作者”或者更高存取权限。如果某个用户具有“编辑者”，就可以加密别人创建的文档。用户可以用私密来加密，也可以用公用通讯录中各个用户都有的公钥加密。具体操作步骤为：第一、选取要加密的文档。第二、选择“文件”、“文档属性”。第三、可以指定有权打开阅读该文档的全部人员名单，如图1所示。第四、单击带钥匙标记的卡即可。第六、此时，指定可以阅读加密文档的全部“读者”或者具备更高权限的人；也可选一个或多个私钥：从“个人密钥”列表中选取。并将该密钥邮寄给需要阅读加密文档的用户，参见本文给出的程序例所示。第七、如果选用公钥，就选择想使用其公钥的人员名单即可，如图2所示。同时，我们能够通过列表的办法来限定允许阅读加密文档的用户。

图1

图2
3　阅读加密文档
　　如果在用户的标识符里，即公用通讯录中用户的“个人”文档里有正确的密钥，他们就可以阅读加密信息。无正确密钥的用户可以读文档未加密部分，但加密部分为空白。例如，李四使用密钥对某个文档中的数据进行加密后。如果张三要阅读这个已经加密的文档就必须具备该密钥。李四使用张三的公钥对某个文档中的数据加密后。如果张三要阅读这个已经加密的文档只需要使用自己的私钥即可解密，也就有权编辑加密文档。如果张三的用户标识符里没有含有相匹配的密钥，加密域就被显示为空白。当有多个密钥和一个表单或文档关联的时候，用户只需要指定密钥之一就能读加密信息。在把一个文档或一个表单和多个密钥关联时，用户需要所有指定的密钥以使用原有的密钥编辑和保存加密信息。应该注意：一个数据库的存取权限有七种。分别为：“不能存放者”、“存放者”、“读者”、“作者”、“编辑者”、“设计者”、“管理者”。只有具备有“作者”或者更高存取权限的用户才可以去掉为自己文档的加密或改变相关联的密钥（如果他们被允许编辑文档且有相关联密钥）。具备“编辑者” 存取权限的用户可以从任何人的文档删除加密的信息或者改变相关联密钥。因此，我们必须把数据库、库中与表单相关文档的授权与加密统一来考虑。
4　数据库安全性以及数据库的授权
　　如果用户通过操作系统级命令，例如dos/windows或Unix环境中的复制命令，拷贝数据库时，数据仍然保持加密。加密数据对应用编程接口（API）程序的存取也是安全的。当然有一点例外，就是带有选项“索引加密域”的全文搜索能够加密数据显示给能存取数据库的任何用户。此外，全文索引文件可以作为服务器上的一个ASCII文本文件读取。
　　当用户为选定的数据库提供本地安全时，Notes使用一个指定的标识符公钥加密数据库。只有用户使用相应的密钥才可解密数据库。可选择三种级别的加密，既强度加密、普通加密和中等加密。
　　如图3所示，在Domino环境中，系统提供了强度、普通和中等加密三种不同算法的。强度加密提供的安全级最高。但是，打开文档的时间比普通、中等加密的时间要长。普通加密提供有限的数据安全性、能够快速打开文档并且我们还可以用磁盘压缩工具对经过普通加密算法处理的数据库进行压缩。然而，我们不能压缩经过高度加密或中等加密算法处理的数据库。

图3
5　结束语
　　防止对非授权的数据库和文档的存取，我们可对数据库选择高强度、中等强度和普通强度的加密算法对数据库进行处理。利用面向对象的技术，采取设计程序来完成对数据库对象中的一些文档对象或者对使用指定表单产生的所有文档以及文档中的字段使用指定密钥或公钥进行加密。只有把数据库、库中与表单相关的文档的授权和加密统一考虑时，加密技术才能够真正起作用从而达到保障信息安全的目的。
作者简介：李俊海　副教授。研究方向：网络与通信。
耿继秀　副教授。研究方向：算法分析与设计。
钱丽瑾　工程师。
刘艳丽　张德壮　硕士研究生。
作者单位：中国科技大学研究生院计算机教学部　北京（100039）
参考文献
［1］　C.P. Pfleeger.Security in Computing.Prentice-Hall International, Inc.，1997
［2］　IBM. Lotus Notes release 4.6: A Developer′s Handbook. International Technical Support Organization,1998
收稿日期:1998-12-10
