分类:
2008-06-06 17:07:16
最近闲着无聊,了解了一下Lotus Encryption,把自己的心得体会记录下来,以便日后查找,也可以方便有需要的人。
首先要声明一点:Lotus Encryption只能是在Notes Client下应用,想在Web下应用的人就不必往下看了。
Lotus/Notes Encryption分为两类,public encryption和secret encryption。下面分别予以介绍。
public encryption就是用Notes ID的密钥来进行加密,该种方式加密后就只能是指定的ID才能decrypt。
secret encryption就是用secret key来进行加密,secret key是在Notes ID中进行创建,创建好了之后还可以mail给其他人,这样只要有这个secret key的ID都
可以decrypt。(至于如何创建secret key请参考帮助,在help里面search“Creating secret encryption keys”即可有详细的操作guide)
下面开始介绍如何在Designer里面来实现这样的加密功能,首先确定Form里面哪些域需要加密,然后在“域属性--advanced--security options”选择"Enable encryption for this field",只要看到选择了加密的域的field delimiters显示为红色就表示设置已经ok。这是最基本的设置,很简单吧:-)
下面需要添加两个内置域"SecretEncryptionKeys"和"PublicEncryptionKeys","SecretEncryptionKeys"用来存放secret encryption方式加密该document的secret key name,"PublicEncryptionKeys"是存放pulic encryption方式加密的人名,用@Name([CN])格式存放就可以。至于要把encryption做成什么形式就看具体的需求了,比如在新建一个form的时候弹出一个框让用户选择"No Encryption","Secret Key Encryption","Public Key Encryption",然后根据用户的选择显示"SecretEncryptionKeys"或"PublicEncryptionKeys",或者同时使用public和secret encryption应该也是可以的(我没试),比如可以把"SecretEncryptionKeys"域做成一个checkbox然后做一个profile文件配置上所有已知的secret key name,以上讲的都是基本的原理,具体的根据你的应用需求来做就好了。
下面接着介绍下encrypt之后的文档所达到的效果,用不能decrypt的ID打开文档时会提示,并且不能看到加密的域也不能编辑文档。在文档属性的fields书签里面也是看不到加密的域的。
最后介绍一段解密已加密文档的代码(万一哪天加密的ID或者secret key被弄丢了这个就派得上用场啦),原理如下:先把已经加密的域解密,然后随便加密一个临时的域,并做保存操作,然后再用NotesDocument.removeitem方法把"$Seal","$SealData","SecretEncryptionKeys"和"PublicEncryptionKeys"当然还有就是那个刚加密的临时域,最后再保存一次即可。为什么要先加密个临时域保存一下呢?如果直接remove那几个内置域的话,被加密的域的值就会显示不出来,那你
这个解密操作也就失去意义啦。具体的那段解密代码如下:
'Must have at least 1 field encrypted in order to call Encrypt method
Dim temp As New NotesItem(doc,"tempjunk","temp")
temp.IsEncrypted=True
Call doc.encrypt
Call doc.save(True, False)
'This portion can now remove the fields relative to encrypting the
'single token encrypted field.
Call doc.removeitem("$Seal")
Call doc.removeitem("$SealData")
If doc.HasItem("SecretEncryptionKeys") Then
Call doc.removeitem("SecretEncryptionKeys")
End If
If doc.HasItem("PublicEncryptionKeys") Then
Call doc.removeitem("PublicEncryptionKeys")
End If
Call doc.removeitem("Encrypt")
Call doc.removeItem("tempjunk")
Call doc.save(True, False)
以上所讲内容只是涉及document的加密,Lotus里面还有db的加密,和邮件的加密等,以后有空再研究,或者哪位有这方面的资料也可以拿出来交流下。