设为首页 收藏本站
查看: 492|回复: 0

[经验分享] SQL Server 2005: 如何让用户只能加密数据却不能解密数据

[复制链接]

尚未签到

发表于 2015-7-2 09:43:24 | 显示全部楼层 |阅读模式
我经常被问及这样的问题,能否让一个用户有加密数据的能力却不能解密数据呢? 答案是:可以。但在我展示这个方法之前,我们先稍微讨论一下对称密钥(symmetric key)。 用户能否加密或解密数据取决于用户能否够打开这个密钥。 如果用户可以打开密钥,那么他既能加密也能解密。 要想限制用户去使用密钥,需要删除用户打开密钥的能力。我们可以创建一个存储过程,将加密和打开密钥的过程封装进去,并让这个存储过程有权限执行这些操作(通过签名),然后赋予用户执行存储过程的权限。这样用户就可以通过存储过程访问密钥,但不能直接方法问密钥。注意,如果用户可以在并行操作中调用这个存储过程,可能会导致密钥被用户直接使用(用户没有打开密钥的权限,却能执行加密/解密操作。译者注)。虽然我不认为这会被利用,但仍存在这种可能性。
下面是示例代码


  
  


--
-- 这个demo演示让用户可以加密数据而不能解密数据
create database test
use test
-- 创建数据库主密钥
create master key encryption by password = 'Avcptnwgu@)!)'
-- 创建一个证书,该证书用于加密下面的对称密钥
create certificate cert_protect_skey_data with subject = 'Certificate for encrypting
symmetric key'
-- 创建对称密钥,用于加密数据
create symmetric key skey_data with algorithm = triple_des encryption by certificate
cert_protect_skey_data
--创建存储过程,使用对称密钥加密数据
create procedure sp_encrypt_with_skey_data
@plaintext  varbinary(8000),
@ciphertext  varbinary(8000) output
as
begin
open symmetric key skey_data decryption by certificate cert_protect_skey_data
set @ciphertext = encryptbykey(key_guid('skey_data'), @plaintext)
close symmetric key skey_data
end
-- 验证该存储过程, 在一个batch内执行下代码
declare @plaintext varbinary(200)
set @plaintext = convert(varbinary(200), 'Plaintext')
declare @ciphertext varbinary(200)
exec sp_encrypt_with_skey_data @plaintext, @ciphertext output
print 'Ciphertext: '
print @ciphertext
print 'Plaintext: '
open symmetric key skey_data decryption by certificate cert_protect_skey_data
print convert(varchar(200), decryptbykey(@ciphertext))
close symmetric key skey_data
go
-- 创建一个不能访问密钥的主体
create login alice with password = 'TiA''ssptncgt#)))'
create user alice
-- 允许Alice执行该存储过程
-- 我们希望她能够使用密钥加密
-- 但不能解密
grant execute on sp_encrypt_with_skey_data to alice
-- 验证Alice可以加密
execute as login = 'Alice'
select suser_name()
-- Alice可以执行存储过程,但他不能访问密钥
-- 密钥并没有所有权链的机制
declare @plaintext varbinary(200)
set @plaintext = convert(varbinary(200), 'Plaintext')
declare @ciphertext varbinary(200)
exec sp_encrypt_with_skey_data @plaintext, @ciphertext output
print 'Ciphertext: '
print @ciphertext
-- Alice明显无法直接访问密钥
open symmetric key skey_data decryption by certificate cert_protect_skey_data
-- revert context
revert
-- 现在对存储过程进行签名,使Alice能够访问密钥
-- 创建用于签名的证书
create certificate cert_sign2use_skey_data with subject = 'Certificate for signing code that
will use the symmetric key'
-- 创建一个映射到证书的用户
create user u_cert_sign2use_skey_data for certificate cert_sign2use_skey_data
-- 授权
grant view definition on symmetric key::skey_data to u_cert_sign2use_skey_data
grant control on certificate::cert_protect_skey_data to u_cert_sign2use_skey_data
-- 签名
add signature to sp_encrypt_with_skey_data by certificate cert_sign2use_skey_data
-- 现在Alice可以真正地使用这个存储过程了
execute as login = 'alice'
select suser_name()
-- 注意,现在Alice仍然不能直接访问密钥
open symmetric key skey_data decryption by certificate cert_protect_skey_data
-- 现在在一个batch执行一下代码,验证加密
-- 注意加密会成功,但解密会失败
declare @plaintext varbinary(200)
set @plaintext = convert(varbinary(200), 'Plaintext')
declare @ciphertext varbinary(200)
exec sp_encrypt_with_skey_data @plaintext, @ciphertext output
print 'Ciphertext: '
print @ciphertext
print 'Plaintext: '
print convert(varchar(200), decryptbykey(@ciphertext))
go
revert
-- cleanup
use master
drop database test
drop login alice
-- EOD
  
  
  原文地址:http://blogs.msdn.com/lcris/archive/2006/01/13/sql-server-2005-example-for-how-to-allow-a-user-to-encrypt-but-not-decrypt.aspx

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82446-1-1.html 上篇帖子: SQL Server备份和灾难恢复 下篇帖子: SQL Server最新补丁与工具大全--数据库管理员必看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表