透明数据加密安全特性解析_第1页
透明数据加密安全特性解析_第2页
透明数据加密安全特性解析_第3页
透明数据加密安全特性解析_第4页
透明数据加密安全特性解析_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

升级大对象(LargeObject,即LOB)存储能力的关键原因是在Oracle11g中数据安全需求越来越高,本文主要是研究如何扩充对LOB和表空间的透明数据加密(TransparentDataEncryption,即TDE)特性来提高数据的安全性,并解释这些特性是如何保护复杂的、非结构化数据的,如医学数字图像通讯信息(DigitalImagingforCommunicationofMedicalInformation,即DICOM)对象。Oracle11g新的SecureFile特性主要是集中在数据压缩和重复数据删除方面,主要是为了节约存储LOB对象的空间,当然在安全特性方面Oracle11g不仅只有这两个,所有这些安全特性也非常符合最近当选的美国总统奥巴马颁布的议事日程,白宫的技术方向明确指明新的管理计划:在电子信息技术系统方面增加投入以降低医疗保健方面的成本,使用卫生信息技术降低医疗保健方面的成本,每年投入100亿美元,到五年后让美国的医疗保健系统扩展为基于标准的电子医疗信息系统,包括电子健康记录。加密LOB:把安全放进SecureFileOracle11g现在把在SecureFileLOB中存储敏感信息放在非常重要的战略位置,因为这样才能够证明在Oracle10gR2中推出的透明数据加密(TDE)的作用,TDE在列级提供了遵循工业标准的自动加密算法(如3DES168,AES128,AES192和AES256)。1、开启透明数据加密在开始使用透明数据加密特性之前,需要在数据库中进行一翻设置,幸运的是,在Oracle11g数据库中这个设置非常简单了,因为现在只需要在数据库的网络配置文件中添加合适的配置目录即可,在之前的Oracle版本中,最简单的方法就是通过OracleWalletManagerutility设置这个“wallet”文件,欲了解前期版本是如何启用透明数据加密特性的,请参考我之前的文章“如何在Oracle10gR2中实现透明数据加密”。清单1中的内容显示了我在SQLNET.ORA网络配置文件中添加的内容,以便在我指定的目录中创建默认的TDEPKI密钥文件ewallet.p12,然后我使用ALTERSYSTEMSETENCRYPTIONKEY命令打开这个“wallet”并开启加密特性。清单1开启透明数据加密在SQLNET.ORA网络配置文件中添加参数设置开启Oracle11g数据库的透明数据加密功能ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/admin/orcl/wallet))然后,打开wallet并设置加密密钥密码激活Oracle11g的加密功能SQL>ALTERSYSTEMSETENCRYPTIONKEYIDENTIFIEDBY"r3aL1y!T16ht";SQL>ALTERSYSTEMSETENCRYPTIONWALLETOPENIDENTIFIEDBY"r3aL1y!T16ht";2、控制SecureFile加密完成TDE设置后,在开启SecureFileLOB加密相对就简单了,和在Oracle表中开启其它类型的加密很类似,ENCRYPT告诉Oracle在现有SecureFileLOB上应用TDE加密,也可以通过DECRYPT告诉Oracle从SecureFileLOB上移除加密特性。3、改变SecureFile加密算法或加密密钥和其它Oracle数据类型一样,ALTERTABLEREKEY命令可以用来修改当前的加密算法,如默认的加密算法AES192改为AES256,TDEPKI密钥发生变化的话,REKEY命令也可以用于重新加密现有的SecureFileLOB。Oracle将会在块级进行加密,确保重新加密执行得更有效。但请注意在相同的分区下对应的SecureFileLOB段只能够被修改为启用或禁用加密,如LOB段不能被REKEY,这是因为Oracle11g在相同的LOB分区内对所有SecureFileLOB使用了相同的加密算法。清单2显示这些命令的示例。清单2对已有的SecureFileLOB应用透明数据加密应用默认的加密给单个SecureFileLOBSQL>ALTERTABLEtrbtkt.secure_ticketsMODIFY(documentCLOBENCRYPT);应用非默认的AES256位加密算法给单个SecureFileLOBSQL>ALTERTABLEtrbtkt.secure_ticketsMODIFY(scrnimgCLOBENCRYPTUSING'AES256');为单个SecureFileLOBrekey加密SQL>ALTERTABLEtrbtkt.secure_ticketsMODIFY(scrnimgCLOBREKEYUSING'AES192');将加密应用给一个分区段SQL>ALTERTABLEtrbtkt.secure_ticketsMODIFYPARTITIONsts_open(LOB(document)(ENCRYPT));从单个SecureFileLOB中移除加密SQL>ALTERTABLEtrbtkt.secure_ticketsMODIFY(scrnimgCLOBDECRYPT);加密表空间Oracle10gR2将它的加密能力扩展到数据库的任意表和索引了,但要识别和隔离那些需要加密的对象和列工作量很大,通常,可能仅仅是将许多在业务功能上相似的对象全部加密了,如数据库中所有封装了机密雇员信息的表和索引,为了使在这些情况下的加密变得更加简单易行,Oracle11g现在可以加密整个表空间了。表空间加密仍然是在块级实现的,但遗憾的是它不能在现有的表空间上执行,因此OracleDBA必须在一开始创建表空间的时候就启用加密,然后OracleDBA就可以使用ALTERTABLEMOVE命令来将表移动到加密表空间中,与此类似,已有的索引也可以通过重新创建命令ALTERINDEXREBUILDONLINE,直接迁移到加密表空间中去。和加密列一样,在创建加密表空间之前,数据库加密wallet必须先打开才行,通过CREATETABLESPACE命令中新的ENCRYPTION指令,新的表空间将会自动应用指定的加密算法到所有存储在其内部的对象,默认采用的是AES128位加密算法,但可以应用任意一个标准的加密算法(3DES168,AES128,AES192和AES256之一),如果不出什么问题的话,一个加密表空间可以传输到一个不同的Oracle11g数据库中,只要源和目标数据库服务器使用了相同的endianness,并共享了相同的加密wallet即可。但注意临时表空间和UNDO表空间不能使用这类加密算法,同样,扩展表源数据和扩展LOB(如BFILE)也不能加密。最后,由于加密密钥是在表级应用的,因此无法为加密表空间内的加密对象执行全局rekey,但在初始化加密表空间时可以使用这个方法来执行一次rekey操作。为了说明加密表空间的特性,我创建了一个新的表空间PATIMAGES,采用了AES256位加密算法,如清单3中的代码所示。我将使用这个新的表空间作为容器,存储后面我们将要讨论到的通过SecureFile在表中存储敏感的医疗信息:使用来自DICOM文件的源数据,在Oracle11g中存储医疗影像和相关信息。清单3创建一个加密表空间存储敏感信息DROPTABLESPACEpatimagesINCLUDINGCONTENTSANDDATAFILES;CREATETABLESPACEpatimagesDATAFILE'/u01/app/oracle/oradata/orcl/patimages01.dbf'SIZE64MREUSEEXTENTMANAGEMENTLOCALUNIFORMSIZE1MSEGMENTSPACEMANAGEMENTAUTOENCRYPTIONUSING'AES256'DEFAULTSTORAGE(ENCRYPT);DICOM:存储病人医疗影像和元数据的工业标准美国放射学会(ACR)和国家电气制造联合会(NEMA)在1993年通过协作将医学影像和通讯(DICOM)标准化了,为医学影像设备和相关应用程序的开发提供了可供参照执行的依据,后来成为存储和传输放射影像通用的标准,Oracle10gR2完全支持DICOM3.0标准,但是直到Oracle11g才实现了对DICOM数据进行加密。Oracle11g扩展了Oracle10gR2中ORDImage对象类型的能力,增加了一个新的ORDDicom对象类型,以便更有效地存储DICOM影像,由于ORDDicom对象可以存储在SecureFileLOB中,这样就可以实现压缩、重复数据删除和加密存储在DICOM文件中的影像和相关的元数据的能力,医生、大学和医院使用计算的病人信息,特别是诊断和研究。Oracle10gR2提供了转储病人信息到XML文件的能力,但现在的ORDDicom对象扩展了这些能力,使得可以直接在Oracle11g数据库查询病人的元数据,这就意味着可以使用新的高级索引特性如XMLIndex数据类型来检索特殊的病人信息,此外,Oracle11g现在还可以创建、存储、展现和检索存储在ORDDicom对象内的数据影像的指纹特征,也就是说将会更容易选中正确的病人信息,ORDDicom数据模型也可以帮助保证病人信息的机密性,因为它提供了一个方法可以避免泄露来自DICOM文件病人元数据中的私密信息。1、创建DICOM对象为了说明如何使用这些强大的功能特性增强Oracle11gSecureFile的加密能力,我创建了一个新的方案和表MIPS.PATIENT_IMAGES,我将使用这个表存储DICOM元数据,并在ORDDicom和ORDImage数据类型列中存储影像数据,DICOM_IMAGE列将会存储来自对应的源文件直接载入的DICOM信息,ANONYMOUS列将会存储病人的敏感数据,THUMBPRINT列将会存储来自每个DICOM文件中第一个影像的指纹图像,清单4显示了我创建这个表的DDL语句。清单4创建加密的SecureFileLOB存储敏感信息创建一个用户(MIPS)DROPUSERmipsCASCADE;CREATEUSERmipsIDENTIFIEDBYmipsDEFAULTTABLESPACEpatimagesTEMPORARYTABLESPACEtempQUOTAUNLIMITEDONpatimages;GRANTCONNECT,RESOURCETOmips;GRANTEXECUTEANYPROCEDUREtomips;GRANTCREATEANYDIRECTORYTOmips;

创建一个新的目录DROPDIRECTORYmips_imgs;CREATEORREPLACEDIRECTORYmips_imgsAS'/home/oracle/dicom';GRANTREADONDIRECTORYmips_imgsTOmips;

创建一个新表MIPS.PATIENT_IMAGES使用SecureFileLOB存储DICOM文件。DROPTABLEmips.patient_imagesPURGE;CREATETABLEmips.patient_images(patient_idNUMBER,nameVARCHAR2(30),ssnVARCHAR2(11),dobDATE,dicom_imageORDSYS.ORDDICOM,anonymousORDSYS.ORDDICOM,thumbprintORDSYS.ORDIMAGE)TABLESPACEpatimagesLOB(dicom_image.source.localData)STOREASSECUREFILE(TABLESPACEpatimagesDISABLESTORAGEINROWDEDUPLICATECOMPRESSHIGHCACHEREADS)LOB(anonymous.source.localData)STOREASSECUREFILE(TABLESPACEpatimagesDISABLESTORAGEINROWDEDUPLICATECOMPRESSHIGHCACHEREADS)LOB(thumbprint.source.localData)STOREASSECUREFILE(TABLESPACEpatimagesDISABLESTORAGEINROWDEDUPLICATECOMPRESSHIGHCACHEREADS);--注释COMMENTONTABLEmips.patient_imagesIS'ContainsPatientmetadataandDICOMimages';IS'UniqueidentifierforaPatient';IS'PatientName';IS'PatientSocialSecurityNumber';IS'PatientDateofBirth';IS'DICOMLOB';IS'AnonymousDICOMLOB';IS'ThumbprintofDICOMimage';--创建索引和约束CREATEUNIQUEINDEXmips.patient_images_pk_idxONmips.patient_images(patient_id)TABLESPACEpatimages;ALTERTABLEmips.patient_imagesADDCONSTRAINTpatient_images_pkPRIMARYKEY(patient_id);2、从DICOM源文件转移到ORDDicom对象现在我已经为DICOM信息创建好了适当的资料库,我将要使用SQL*Loader直接从DICOM源文件中提取并格式化病人元数据,对于我的源数据,我将使用若干个简单的DICOM文件,这些DICOM文件都是从下载得到的,病人的姓名和其它信息完全是虚构的,只是为了说明这些概念,清单5显示了SQL*Loader用于初始化、格式化和从这些源文件中载入DICOM数据到ORDDicom和ORDImage数据类型列的参数文件,以及调用SQL*Loader执行这个初始化数据载入的结果。清单5使用SQL*Loader载入DICOM原始文件到Oracle11g数据库中--SQL*Loader参数文件:LoadDICOMFromFile.sqlparms--目的:这个参数文件将直接从DICOM文件载入DICOM数据到MIPS.PATIENT_IMAGES表的DICOM_IMAGE列,它也控制了ANONYMOUS列(它容纳匿名的DICOM数据)和THUMBPRINT列(它容纳DICOM图像本身的指纹图像)的初始化。LOADDATAINFILE*INTOTABLEmips.patient_imagesTRUNCATEFIELDSTERMINATEDBYWHITESPACEOPTIONALLYENCLOSEDBY'"'(patient_idINTEGEREXTERNAL,nameCHAR,ssnCHAR,dobDATE"yyyy-mm-dd",fnFILLERCHAR--载入列对象MIPS.PATIENT_IMAGES.DICOM_IMAGE:--1.)LOB属性source.localData和DICOM数据一起载入。--2.)属性srcType被设置为"local"。--3.)属性updateTime被初始化到当前日期。--4.)LOB属性扩展使用空的LOB进行初始化。,dicom_imageCOLUMNOBJECT(sourceCOLUMNOBJECT(localDataLOBFILE(fn)TERMINATEDBYEOF,srcTypeCONSTANT'local',updateTimeEXPRESSION"SYSDATE"),extensionLOBFILE(fn)TERMINATEDBYEOFDEFAULTIFdicom_image.source.srcType='local')--初始化(但不载入)列对象MIPS.PATIENT_IMAGES.ANONYMOUS:--1.)LOB属性source.localData和扩展被初始化。--2.)srcType属性被初始化为"local"。--3.)localDataLOB将容纳DICOM数据的匿名内容。--4.)srcType属性被初始化为"local"。--5.)LOB扩展是一个由ORDDICOM使用的内部字段。,anonymousCOLUMNOBJECT(sourceCOLUMNOBJECT(localDataLOBFILE(fn)TERMINATEDBYEOFDEFAULTIFanonymous.source.srcType='local',srcTypeCONSTANT'LOCAL'),extensionLOBFILE(fn)TERMINATEDBYEOFDEFAULTIFdicom_image.source.srcType='local')--初始化(但不载入)列对象MIPS.PATIENT_IMAGES.THUMBPRINT:--1.)LOB属性扩展被一个空的LOB初始化。--2.)LOB属性source.localData被一个空的LOB初始化。--3.)本地属性被初始化为1。,thumbprintCOLUMNOBJECT(sourceCOLUMNOBJECT(localDataLOBFILE(fn)TERMINATEDBYEOFDEFAULTIFthumbprint.source.local=X'1',localCONSTANT1)))BEGINDATA101"Ames,Aldritch"322-51-11111907-12-01CT-MONO2-16-ankle.dcm202"Barry,Dave"345-21-22221968-12-24OT-MONO2-8-colon.dcm303"Colson,Charles"342-43-33331931-11-03MR-MONO2-8-16x-heart.dcm404"Dean,John"322-09-44441942-02-18NM-MONO2-16-13x-heart.dcm505"Ehrlichman,John"345-09-55551914-08-01US-PAL-8-10x-echo.dcm606"Haldeman,Robert"322-18-66661918-11-11US-RGB-8-esopecho.dcm>>>SQL*Loaderresults:SQL*Loader:Release.0-ProductiononSatMar1413:00:402009Copyright(c)1982,2007,Oracle.Allrightsreserved.ControlFile:LoadDICOMFromFile.sqlparmsDataFile:LoadDICOMFromFile.sqlparmsBadFile:LoadDICOMFromFile.badDiscardFile:nonespecified(Allowalldiscards)Numbertoload:ALLNumbertoskip:0Errorsallowed:50Bindarray:64rows,maximumof256000bytesContinuation:nonespecifiedPathused:ConventionalTableMIPS.PATIENT_IMAGES,loadedfromeverylogicalrecord.Insertoptionineffectforthistable:TRUNCATEColumnNamePositionLenTermEnclDatatypePATIENT_IDFIRST*WHTO(")CHARACTERNAMENEXT*WHTO(")CHARACTERSSNNEXT*WHTO(")CHARACTERDOBNEXT*WHTO(")DATEyyyy-mm-ddFNNEXT*WHTO(")CHARACTER(FILLERFIELD)DICOM_IMAGEDERIVED*COLUMNOBJECT***FieldsinDICOM_IMAGESOURCEDERIVED*COLUMNOBJECT***FieldsinDICOM_IMAGE.SOURCELOCALDATADERIVED*EOFCHARACTERDynamicLOBFILE.FilenameinfieldFNSRCTYPECONSTANTValueis'local'UPDATETIMEEXPRESSIONSQLstringforcolumn:"SYSDATE"***EndoffieldsinDICOM_IMAGE.SOURCEEXTENSIONDERIVED*EOFCHARACTERDynamicLOBFILE.FilenameinfieldFNDEFAULTifDICOM_IMAGE.SOURCE.SRCTYPE=0X6c6f63616c(character'local')***EndoffieldsinDICOM_IMAGEANONYMOUSDERIVED*COLUMNOBJECT***FieldsinANONYMOUSSOURCEDERIVED*COLUMNOBJECT***FieldsinANONYMOUS.SOURCELOCALDATADERIVED*EOFCHARACTERDynamicLOBFILE.FilenameinfieldFNDEFAULTifANONYMOUS.SOURCE.SRCTYPE=0X6c6f63616c(character'local')SRCTYPECONSTANTValueis'LOCAL'***EndoffieldsinANONYMOUS.SOURCEEXTENSIONDERIVED*EOFCHARACTERDynamicLOBFILE.FilenameinfieldFNDEFAULTifDICOM_IMAGE.SOURCE.SRCTYPE=0X6c6f63616c(character'local')***EndoffieldsinANONYMOUSTHUMBPRINTDERIVED*COLUMNOBJECT***FieldsinTHUMBPRINTSOURCEDERIVED*COLUMNOBJECT***FieldsinTHUMBPRINT.SOURCELOCALDATADERIVED*EOFCHARACTERDynamicLOBFILE.FilenameinfieldFNDEFAULTifTHUMBPRINT.SOURCE.LOCAL=0X01(character'')LOCALCONSTANTValueis'1'***EndoffieldsinTHUMBPRINT.SOURCE***EndoffieldsinTHUMBPRINTTableMIPS.PATIENT_IMAGES:6Rowssuccessfullyloaded.0Rowsnotloadedduetodataerrors.0RowsnotloadedbecauseallWHENclauseswerefailed.0Rowsnotloadedbecauseallfieldswerenull.Spaceallocatedforbindarray:83456bytes(64rows)Readbufferbytes:1048576Totallogicalrecordsskipped:0Totallogicalrecordsread:6Totallogicalrecordsrejected:0Totallogicalrecordsdiscarded:0RunbeganonSatMar1413:00:402009RunendedonSatMar1413:00:492009Elapsedtimewas:00:00:09.65CPUtimewas:00:00:00.613、生成指纹图像和匿名的元数据为了完成ANONYMOUS和THUMBPRINT列的填充,我将使用一些技巧:(1)首先,我将通过调用setModel方法载入ORDDicom对象模型,这个对象模型必须在调用其它方法之前载入。(2)然后使用processCopy方法生成一张150x200的JPEG图像,将其存储到THUMBPRINT列中。(3)最后,我使用makeAnonymous方法创建一个匿名版本的DICOM_IMAGE列数据,并将其存储到ANONYMOUS列中。清单6显示了如何在最初被载入MIPS.PATIENT_IMAGES表中的所有行上执行这些方法。清单6从前面载入的ORDDicom对象创建和存储匿名的病人信息和指纹图像:1)将DICOM模型载入到内存中。2)将原始的DICOM文件元数据转换成对应的元素。3)基于原始的DICOM影像以JPEG格式创建一个缩略图。4)生成一个匿名的DICOM文件版本。5)将新的信息保存到它们对应的SecureFileLOB中。SETSERVEROUTPUTONDECLAREdcm_rowORDSYS.ORDDICOM;BEGIN--载入DICOM数据模型ord_dicom.setDatamodel;--在医学图像表中遍历所有行FORdcm_rowIN(SELECTpatient_id,dicom_image,anonymous,thumbprintFROMmips.patient_imagesFORUPDATE)LOOPBEGIN通过setProperties存储过程初始化DICOMSecureFileLOB列属性dcm_row.dicom_image.setProperties();在原始DICOM影像的基础上构建一个缩略图图像dcm_row.dicom_cessCopy('fileFormat=JPEGfixedScale=150,200',dcm_row.thumbprint);通过makeAnonymous()函数生成DICOM对象的匿名版本dcm_row.dicom_image.makeAnonymous(genUID(dcm_row.patient_id),dcm_row.anonymous);将新产生的信息保存到它们对应的SecureFileLOB中UPDATEmips.patient_imagesSETdicom_image=dcm_row.dicom_image,anonymous=dcm_row.anonymous,thumbprint=dcm_row.thumbprintWHEREpatient_id=dcm_row.patient_id;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('ErrorprocessingimageforPatientID#'||dcm_row.patient_id);END;ENDLOOP;COMMIT;END;/

4、使用ORDDicom和ORDImage列的内容最后,我已经准备好研究这些已经载入到DICOM列的DICOM信息,幸运的是,ORDDicom数据类型使得这些工作变得相当简单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论