ASE 列加密选项的使用.docx
《ASE 列加密选项的使用.docx》由会员分享,可在线阅读,更多相关《ASE 列加密选项的使用.docx(16页珍藏版)》请在冰豆网上搜索。
ASE列加密选项的使用
ASE列加密选项的使用
测试环境:
AdaptiveServerEnterprise/12.5.4/EBF14925ESD#7/P/NT(IX86)/OS4.0/ase1254/
2093/32-bit/OPT/WedOct1023:
00:
012007
一.配置SYSAM激活列加密选项(ASE_ENCRYPTION);
DEMOLicense可以从网站http:
//robroy/SySAM/index.html申请。
激活后lmgrd.log中显示下面的类似信息:
16:
51:
17(SYBASE)Serverstartedonvm2003for:
ASE_SERVER
16:
51:
17(SYBASE)ASE_ENCRYPTION
二.激活ASE列加密功能;
1>sp_configure'enableencryptedcolumns',1
2>go
ParameterNameDefaultMemoryUsedConfigValue
RunValueUnitType
----------------------------------------------------------------
-----------------------------------------
enableencryptedcolumns021
0switchstatic
静态参数,重启ASE并在日志中看到下面类似信息:
00:
00000:
00000:
2008/03/1817:
02:
31.93kernel
Uselicensefilec:
\sybase\SYSAM-1_0\licenses\license.dat.
00:
00000:
00000:
2008/03/1817:
02:
31.93kernelCheckedoutlicenseASE_SERVER
00:
00000:
00000:
2008/03/1817:
02:
31.96kernelCheckedoutlicenseASE_ENCRYPTION
三.列加密功能实现:
1.设置系统加密口令
sp_encryptionsystem_encr_passwd,password
Password可以长达64个字节,AdaptiveServer将使用它加密该数据库中的所有密钥。
设置系统加密口令后,您在访问密钥或数据时不必再指定该口令。
必须在创建加密密钥的每个数据库中设置系统加密口令。
系统安全员可以通过使用sp_encryption并提供旧口令来更改系统口令。
sp_encryptionsystem_encr_passwd,password[,old_password]
更改系统口令后,AdaptiveServer会自动使用新口令对数据库中的所有密钥重新加密。
2.创建、更改、删除密钥
●创建密钥
ASE15在服务器内管理密钥。
密钥以一种加密格式存储在数据库的sysencryptkeys表中。
为了给AES加密算法产生一个名为ssn_key的密钥,可以使用命令:
createencryptionkeykeyname[asdefault]foralgorithm
[with[keylengthnum_bits]
[init_vector[null|random]]
[pad[null|random]]]
Øalgorithm—高级加密标准(AES)是唯一受支持的算法。
AES支持的密钥大小为128位、192位和256位,支持的块大小为16字节
Økeylengthnum_bits—要创建的密钥的大小(以位为单位)。
对于AES,有效的密钥长度为128、192和256位。
缺省密钥长度为128位
Øinit_vectorrandom—指定在加密过程中使用初始化矢量。
当加密算法使用初始化矢量时,两段相同纯文本的密文是不同的,这样可防止cryptanalyst检测数据模式。
使用初始化矢量可提高数据的安全性。
初始化矢量对性能还有一些影响。
只有对加密密钥未指定初始化矢量的列才能执行索引创建、优化连接和搜索。
Øpadnull—缺省设置。
它将忽略随机数据填充。
如果列必须支持索引,则不能使用填充。
Øpadrandom—在加密前自动填充随机字节大小的数据。
通过使用填充代替初始化矢量,可以使密文随机化。
只有纯文本长度小于块长度的一半的列才适合填充。
对于AES算法,块的长度为16字节。
若要创建加密密钥,请使用createencryptionkey,它将:
•使用SecurityBuilderCrypto™API在内部创建具有指定密钥长度的
对称密钥。
•在系统目录sysencryptkeys中以加密的形式存储密钥
AdaptiveServer中的列加密功能使用高级加密标准(AES)对称密钥加密算法,可用的密钥大小为128、192和256位。
随机密钥生成和密码功能由SecurityBuilderCrypto™API提供。
可以为每个加密列创建单独的密钥。
密钥可在多个列间共享,但每个列只能拥有一个密钥。
在加密列时,若要对一个列使用初始化矢量,而对另一个列不使用初始化矢量,则可创建两个单独的密钥,一个指定使用初始化矢量,而另一个则不指定
列加密使用对称加密算法,这意味着,将使用同一密钥进行加密和解密
为对密钥值提供安全保护,AdaptiveServer使用系统加密口令生成128位的密钥加密密钥,而此密钥又反过来用于加密新创建的密钥。
列加密密钥以加密的形式存储在sysencryptkeys系统表中。
●更改密钥(只用于设置缺省和取消缺省)
若要更改缺省加密密钥,请输入:
alterencryptionkeykey1asdefault
如果缺省密钥已经存在,它将不再具有缺省属性。
key1将成为缺省密钥。
如果key1是缺省密钥,则可以按照以下方式删除key1的缺省名称:
alterencryptionkeykey1asnotdefault
如果key1不是缺省密钥,则此命令将返回错误。
AdaptiveServerEnterprise12.5.3a1.列加密
alterencryptionkeyasdefault或notdefault只能由系统安全员执行,且不能授予其他用户。
●删除密钥
dropencryptionkey
密钥所有者和系统安全员可以删除加密密钥。
如果任何数据库中有任意列使用该密钥加密,则此命令将失败。
语法dropencryptionkey[database.[owner].]keyname
3.权限管理
●授予创建密钥权限
系统安全员具有创建加密密钥的缺省权限,并可以将该权限授予其他用户。
语法grantcreateencryptionkeytouser|role|group
●撤销创建密钥权限
系统安全员可以撤消其他用户、组和角色创建加密密钥的权限。
语法revokecreateencryptionkeyfromuser|role|group
●赋予、回收使用密钥的权限
密钥所有者必须向其他用户授予密钥的select权限,然后该用户才能在createtable、altertable和selectinto语句中指定该密钥。
对于数据库的缺省密钥,其所有者为系统安全员。
仅应“根据需要”授予对密钥的select权限。
grantselectonkey_nametouser|role|group
revokeselectonkey_namefromuser|role|group
以下示例允许具有db_admin_role的用户,在createtable和altertable语句中指定加密时使用加密密钥“safe_key”:
grantselectonsafe_keytodb_admin_role
通过insert、update、delete和select处理加密列的用户,不需要对加密密钥具有select权限。
●授予解密权限
表所有者或系统安全员可授予对表或表中某些列的列表的decrypt权限。
语法grantdecrypton[owner.]tablename[(columnname[{,columname}])]touser|group|role
注释:
对表或列执行grantall并不授予解密权限。
●撤消解密权限
可以使用以下语法撤消用户的解密权限:
revokedecrypton[owner.]table[(column[{,column}])]fromuser|group|role
4.创建包含加密列的表
若要对新表中的列加密,请在createtable语句中使用以下列选项:
[encrypt[with[database.[owner].]keyname]]
keyname—标识使用createencryptionkey创建的密钥。
表的创建者
必须对keyname具有select权限。
如果未提供keyname,Adaptive
Server将查找使用createencryptionkey中的asdefault子句创建的缺
省密钥。
以下示例创建两个密钥:
一个是数据库缺省密钥,它使用init_vector、pad和keylength的缺省值;另一个是使用非缺省值的命名密钥cc_key。
employee表中的ssn列使用缺省密钥加密,customer表中的creditcard列使用cc_key加密:
createencryptionkeynew_keyasdefaultforAES
createencryptionkeycc_keyforAESwithkeylength256init_vectornullpadrandom
createtableemployee_table(ssnchar(15)encrypt)
createtablecustomer(creditcardchar(20)encryptwithcc_key)
5.加密列的索引
如果指定的加密密钥不使用初始化矢量或随机填充,则可以对其加密的列创建索引。
如果加密列具有初始化矢量或随机填充,则对其执行createindex命令时,将发生错误。
加密列的索引对等于和不等于匹配非常有用,但不能用于范围搜索或排序。
在以下示例中,cc_key指定不使用初始化矢量或填充进行加密。
它允许对任何用cc_key加密的列创建索引:
createencryptionkeycc_keyforAES
withinit_vectornull
createtablecustomer(custidint,
creditcardvarchar(16)encryptwithcc_key)
createindexcust_idxoncustomer(creditcard)
6.加密现有表中的数据
若要对现有表中的列加密,请在altertable语句中使用以下列选项:
[encrypt[with[database.[owner].]keyname
keyname—标识使用createencryptionkey创建的密钥。
表的创建者必须对keyname具有select权限。
如果未提供keyname,AdaptiveServer将查找使用createencryptionkey中的asdefault子句创建的缺省密钥。
注释:
对现有表中的列加密时,如果表中创建有触发器,则会导致alter table因错误而失败。
在变更表以进行加密之前,必须删除触发器,并在执行altertable..encrypt后重新创建该触发器。
您可以在更改列的加密属性的同时,更改列的其它属性(如数据类型和可为空性)。
还可以使用altertable添加加密列。
例如:
altertablecustomermodifycustidencryptwithcc_key
altertablecustomeraddaddressvarchar(50)encryptwithcc_key
7.解密数据
您必须具有以下两种权限,才能从加密列中选择明文数据,或者对加密
列进行搜索或连接:
●对列的select权限
●对列的decrypt权限,用于目标列表以及where、having、orderby、update等其它类似子句
表所有者使用grantdecrypt向其他用户、组和角色显式授予对表中的一个或多个列解密的权限。
当过程或视图所有者授予以下权限时,可以隐式授予解密权限:
●针对存储过程的exec权限,用于从具有以下特征的加密列中进行选择:
过程的所有者同时拥有包含该加密列的表。
8.更改用于加密列的密钥
作为信息安全策略的一部分,应定期更改用于加密列的密钥。
使用createencryptionkey创建一个新密钥,然后通过altertable...modify来用新密钥对列加密。
以下示例假定creditcard列已经过加密。
altertable命令会使用cc_key_new对每个customer行的creditcard值进行解密并重新加密。
createencryptionkeycc_key_newforAES
altertablecustomermodifycreditcardencryptwithcc_key_new
9.删除加密和密钥
●删除列加密
如果您是表所有者,则可以使用带有decrypt选项的altertable删除对列的加密。
其语法为:
altertabletable_namemodifycolumn_namedecrypt
例如,删除对customer表中creditcard列的加密:
altertablecustomermodifycreditcarddecrypt
●删除密钥
系统安全员和密钥所有者可以删除密钥。
仅当所有数据库中没有使用密
钥的加密列时,才能删除该密钥。
无法在可疑数据库和脱机数据库中检
查是否存在由该密钥加密的列。
该命令会发出一条警告消息来指出不可
用的数据库,但它不会失败。
将该数据库联机后,所有包含用已删除密
钥加密的列的表都将变为不可用。
若要恢复该密钥,系统管理员必须装
载在删除密钥之前转储的已删除密钥的数据库。
使用以下语法删除加密密钥:
dropencryptionkey[database.[owner].]keyname
例如:
dropencryptionkeycust.dbo.cc_key
10.加密数据类型
可以对以下数据类型加密:
•int、smallint、tinyint
•float4和float8
•decimal和numeric
•char和varchar
•binary和varbinary
磁盘上加密的数据的基本类型为varbinary。
有关varbinary数据长度的详细信息,
不会对空值加密。
11.加密列的长度
在createtable和altertable操作期间,AdaptiveServer将计算加密列的最大内部长度。
若要做出有关模式安排和页大小的决策,数据库所有者必须知道加密列的最大长度。
AES是一种块密码算法。
在块密码算法中,加密数据的长度是该加密算法中块大小的倍数。
对于AES,块大小为128位(即16字节)。
因此,加密列至少占用16字节的空间,额外空间用于:
●初始化矢量。
如果使用初始化矢量,它会向每个加密列添加16字节。
缺省情况下,加密过程会使用初始化矢量。
在createencryptionkey中指定init_vectornull可忽略初始化矢量。
●纯文本数据的长度。
如果列类型是char、varchar、binary或varbinary,则其数据在加密之前会添加2个字节的前缀。
除非附加的2个字节导致密文占用额外的块,否则,加密列不会再占用额外的空间。
●一个sentinel字节。
该字节附加到密文的后面,可防止数据库系统删除尾随零。
注释:
加密列在磁盘中的列长度将增加,但这种增加是不可见的。
例如,sp_help仅显示原始大小
12.selectinto命令
缺省情况下,即使源表包含一个或多个加密列,selectinto也会创建不带加密的目标表。
使用selectinto需要拥有对源表的列级权限,包括decrypt。
使用以下语法对新表中的列加密:
select[all|distinct]
intotable_name
[(colnameencrypt[with[[database.[owner].]keyname]
[,colnameencrypt
[with[[database.]owner].]keyname]])]
fromtable_name|view_name
即使数据在源表中未加密,也可以对目标表中的特定列加密。
如果用于加密源表中的列的密钥与为目标列指定的密钥相同,AdaptiveServer将绕过源表的解密步骤以及目标表的加密步骤。
用于对目标表加密的规则,与用于对源表执行的createtable中的encrypt限定符的规则,存在以下相同点:
●允许加密列中的数据类型
●忽略keyname时使用数据库的缺省密钥
●需要对用于加密目标列的密钥拥有select权限
例如,加密creditcard列:
selectcreditcard,custid,sum(amount)into#bigspenders
(creditcardencryptwithcust.dbo.new_cc_key)
fromdaily_xactsgroupbycreditcardhavingsum(amount)>$5000
13.批量复制(bcp)
bcp可以采用纯文本或密文的形式在数据库间传送加密的数据。
缺省情况下,bcp复制纯文本数据。
bcp按照以下方式处理纯文本数据文件:
•在执行bcpin时,AdaptiveServer会在插入数据前自动对数据加密。
使用慢速bcp。
用户必须对所有列都具有insert和select权限。
•执行bcpout时,AdaptiveServer将自动对数据解密。
用户需要对所有列都具有select权限;此外,还需要对加密列具有decrypt权限。
以下示例将“customer”表复制出为采用本机格式的纯文本数据:
bcpuksales.dbo.customeroutuk_customers-n–Uroy-Proy123
使用bcp的-C选项可将数据作为密文复制。
复制密文时,可以跨不同的操作系统复制数据。
如果将字符数据复制为密文,则两个平台必须支持相同的字符集。
bcp的-C选项允许管理员在缺少对数据的decrypt权限时运行bcp。
使用-C选项时,bcp将按以下方式处理数据:
•假定在执行bcpin期间数据采用密文格式,并且AdaptiveServer不执行加密。
仅当要复制到AdaptiveServer的文件是使用bcpout的-C选项创建时,才可以在bcpin中使用-C选项。
已复制密文所在的源列与数据复制到的列必须具有完全相同的列属性,并使用同一密钥加密。
使用快速bcp。
用户必须具有insert和select权限。
•执行bcpout时,不对从AdaptiveServer复制出的数据解密。
密文数据采用十六进制格式。
用户必须对所有列都具有select权限。
复制密文时,不需要对加密列执行decrypt操作。
•加密的char或varchar数据将保留AdaptiveServer在加密数据时使用的字符集。
如果将数据以密文格式复制到另一台服务器,则目标服务器上使用的字符集必须与从源服务器复制的加密数据的字符集相匹配。
源服务器在加密数据时使用的字符集与加密数据并未存储在
一起,且该字符集在目标服务器上是未知的或并未进行转换。
系统管理员必须检验源服务器和目标服务器上的字符集是否匹配。
还可以在不使用-C选项的情况下执行bcp,这样便不会遇到字符集问题。
用于字符集转换的-J选项不能与-C选项一起使用。
以下示例复制“customer”表。
将以密文形式复制出cc_card列。
其它列则以字符格式复制。
用户“roy”无需对customercc_card具有解密权限。
bcpuksales.dbo.customeroutuk_customers-C-c–Uroy-Proy123
警告!
仅当视图限定不搜索加密的列时,才可以对视图执行带有-C标志的bcpout。
14.load和dump数据库
dump和load用于处理加密列的密文。
这一行为可确保加密列中的数据在磁盘上仍保持加密状态。
dump和load与整个数据库有关。
缺省密钥和在同一数据库中创建的密钥将同与它们相关的数据一起转储和装载。
如果装载数据库包含其它数据库中使用的加密密钥,则除非使用新语法withoverride,否则load将不会成功。
loaddatabasekey_dbfrom"/tmp/key_db.dat"withoverride
如果密钥与它们加密的列位于单独的数据库中,Sybase建议:
●当转储包含加密列的数据库时,还应转储创建密钥的数据库。
如果自上次转储以后添加了新的密钥,则必须执行此操作。
●当转储包含加密密钥的数据库时,应转储包含用该密钥加密的列的所有数据库。
这样可保持加密的数据与可用密钥同步。
●在装载包含加密密钥的数据库和包含加密列的数据库之后,请将这两个数据库同时联机。
●如果将包含密钥的数据库装载到具有不同名称的数据库中,则当您访问其它数据库中的加密列时,将导致发生错误。
若要更改密钥数据库的数据库名,请执行下列步骤:
●在转储包含加密列的数据库之前,请使用altertable解密数据。
●转储包含密钥和加密列的数据库。
●装载数据库之后,通过altertable用新命名数据库中的密钥对数据重新加密。
15.性能考虑事项
加密是一