大牛,请帮忙提点建议

bean_sql 2012-06-16 12:02:43
初次使用数据库的【对称证书加密技术】,
有如下问题想请教下:
1:如果之前创建的证书或者对称密钥丢失怎么办?
2:当我把数据库放到另外一台服务器,这些加密是否还能正常使用?(过会自己测试下)
3:备份 Master Key 、证书、对称密钥的作用
4:加密的算法,通常都使用哪些种类?目前使用的是DES。
5:加密后,以后要注意哪些事宜。
6:帮忙看下这个帖子:
http://topic.csdn.net/u/20120615/12/12be04c7-c56d-40c6-8450-710366f079e3.html

以下是自己写的一个使用案例,
如果有不合适的地方,望指点下




if object_id('t_encryption','u') is not null drop table t_encryption
go
create table t_Encryption
(
DCNO int identity primary key,
DCNAME varchar(50) ,
SalaryInfo varbinary(max)
)
go
---------------------------------------------------创建加密证书
create certificate cert_SalaryInfo
Encryption by password='P@ssw0rd'
with
subject=N'Salary Information Encryption',
expiry_date='9999-12-31'
-----删除证书
----- drop certificate cert_SalaryInfo
go
---------------------------------------------------创建对称加密
create symmetric key sym_SalaryInfo
with
algorithm=DES --使用DES 加密算法(*不知道原理)
encryption by certificate cert_SalaryInfo
----删除对称加密
----drop symmetric key sym_SalaryInfo
go
---------------------------------------------------打开对称加密(插入数据前要打开对称加密,否则将无效)
open symmetric key sym_SalaryInfo
decryption by certificate cert_SalaryInfo
with password =N'P@ssw0rd'
go
---------------------------------------------------插入加密数据
insert into t_Encryption(DCNAME,SalaryInfo)
select 'andy',ENCRYPTBYKEY(KEY_GUID('sym_SalaryInfo'),N'1000.00') union all
select 'job',ENCRYPTBYKEY(KEY_GUID('sym_SalaryInfo'),N'2000.03')
go
---------------------------------------------------关闭密钥
close symmetric key sym_SalaryInfo
go
---------------------------------------------------查询表数据
select * from t_Encryption
/*
DCNO DCNAME SalaryInfo
----------- -------------------------------------------------- -----------------------------------------------------------------------------------------------------------
1 andy 0x00A4EFE20ABB16458517D289B626ECB20100000060F12ABBD792B7C542DC8AAEC496A3796A9C0B7D454F56CAC6AA60763953B631
2 job 0x00A4EFE20ABB16458517D289B626ECB2010000003CAAC262CE95588561CA30139608AD380608F12F70E7271006702FA037D5AE1A

(2 row(s) affected)
*/
go
---------------------------------------------------使用对称加密直接查看(不开启对称加密)
select
DCNO,
DCNAME,
convert(nvarchar(500),DECRYPTBYKEY(SalaryInfo)) as SalaryInfo
from t_Encryption
/*
DCNO DCNAME
----------- -------------------------------------------------- -------------------
1 andy NULL
2 job NULL

(2 row(s) affected)
*/
go
--------------------------------------------------查询数据前要打开加密
open symmetric key sym_SalaryInfo
decryption by certificate cert_SalaryInfo
with password =N'P@ssw0rd'
go
select
DCNO,
DCNAME,
convert(nvarchar(500),DECRYPTBYKEY(SalaryInfo)) as SalaryInfo
from t_Encryption
/*
DCNO DCNAME SalaryInfo
----------- -------------------------------------------------- ------------------
1 andy 1000.00
2 job 2000.03

(2 row(s) affected)
*/
go
--------------------------------------------------更新DCNO=1的salaryinfo 变为1500
update t_Encryption set SalaryInfo=ENCRYPTBYKEY(KEY_GUID('sym_SalaryInfo'),N'1500')
where DCNO=1
go
--------------------------------------------------再次插入一条记录
insert into t_Encryption(DCNAME,SalaryInfo)
select 'Ivan',ENCRYPTBYKEY(KEY_GUID('sym_SalaryInfo'),N'3000')
go
select
DCNO,
DCNAME,
convert(nvarchar(500),DECRYPTBYKEY(SalaryInfo)) as SalaryInfo
from t_Encryption
/*
DCNO DCNAME SalaryInfo
----------- -------------------------------------------------- ---------------------
1 andy 1500
2 job 2000.03
3 Ivan 3000

(3 row(s) affected)
*/
go
--------------------------------------------------使用完成后一定要记住关闭掉
close symmetric key sym_SalaryInfo
go
--------------------------------------------------关闭后查询(在没有开锁的情况下)
select
DCNO,
DCNAME,
SalaryInfo as SalaryInfo_,
convert(nvarchar(500),DECRYPTBYKEY(SalaryInfo)) as SalaryInfo
from t_Encryption
/*
DCNO DCNAME SalaryInfo_ SalaryInfo
1 andy 0x00A4EFE20ABB16458517D289B626ECB201000000DF23BA3059585CF3C6F0D3C3CA7EB685B201DAEAEF4351570FEE080D5927DD46 NULL
2 job 0x00A4EFE20ABB16458517D289B626ECB2010000003CAAC262CE95588561CA30139608AD380608F12F70E7271006702FA037D5AE1A NULL
4 Ivan 0x00A4EFE20ABB16458517D289B626ECB201000000D39FA6B1F9090FFC9488DD8947BD068D9B995776FC1A6E018DED081EA3150D5C NULL
*/

...全文
194 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2012-07-01
  • 打赏
  • 举报
回复
md5加密后,无法取回原内容的
只能把用户输入的也md5一次,比较结果
叶子 2012-07-01
  • 打赏
  • 举报
回复
数据库中使用加密函数,然后程序中再md5加密一次,貌似就相对安全了
bean_sql 2012-06-30
  • 打赏
  • 举报
回复
如果使用 EncryptByPassPhrase 在程序里调用 数据库跟踪 是否能跟踪到解密语句
感觉程序执行 会转化成 SQL脚本的..

[Quote=引用 7 楼 的回复:]

如果数据不多当然可以,但是也很不好,主要是密码需要在每次查询给出来,被人一跟踪就泄密了

放在程序加解密的话,密码可以写在程序代码中,程序混淆好了就不容易泄密
[/Quote]
haitao 2012-06-30
  • 打赏
  • 举报
回复
什么数据库?2005还是2008还是2012?

程序加密后,再写入数据库
数据库读出后,程序解密了才能使用
昵称被占用了 2012-06-19
  • 打赏
  • 举报
回复
想复杂了吧,你在程序中随便搞个什么加解密算法(选择看你的加密需要),在修改和插入前调用,写入库的全部是密文,谁看到也只能知道加密方法才能解开,或者说离开程序就看不到不就可以了。
数据库负责存储就行了。
昵称被占用了 2012-06-19
  • 打赏
  • 举报
回复
还有一个,就是对性能的影响,查询时在数据库转换影响数据库性能,在程序中可以批量处理,速度应快些,至少不影响数据库性能。

对于作为条件的查询,程序可以加密后查询
朗晴 2012-06-19
  • 打赏
  • 举报
回复
友情帮顶,支持楼主。
昵称被占用了 2012-06-19
  • 打赏
  • 举报
回复
如果数据不多当然可以,但是也很不好,主要是密码需要在每次查询给出来,被人一跟踪就泄密了

放在程序加解密的话,密码可以写在程序代码中,程序混淆好了就不容易泄密
bean_sql 2012-06-19
  • 打赏
  • 举报
回复


[Quote=引用 5 楼 的回复:]

想复杂了吧,你在程序中随便搞个什么加解密算法(选择看你的加密需要),在修改和插入前调用,写入库的全部是密文,谁看到也只能知道加密方法才能解开,或者说离开程序就看不到不就可以了。
数据库负责存储就行了。
[/Quote]

使用这种方法应该可以的吧?

CREATE TABLE tb(ID int IDENTITY(1,1),data varbinary(8000));
GO

INSERT tb(data)
SELECT EncryptByPassPhrase(N'这是密码',N'这是要加密的内容2');

--解密
select * from tb
SELECT CONVERT(NVARCHAR(50),DECRYPTBYPASSPHRASE(N'这是密码,用来加密的',data)) ,
convert(nvarchar(50),DECRYPTBYPASSPHRASE(N'这是密码',data))
FROM tb

GO
DROP TABLE tb

xupeihuagudulei 2012-06-16
  • 打赏
  • 举报
回复
不懂,帮顶,
SQL777 2012-06-16
  • 打赏
  • 举报
回复
1:如果之前创建的证书或者对称密钥丢失怎么办?
这丢了就打不开了
2:当我把数据库放到另外一台服务器,这些加密是否还能正常使用?(过会自己测试下)
数据还是加密的。加密证书可以导入
3:备份 Master Key 、证书、对称密钥的作用
这个就可以帮助上面
4:加密的算法,通常都使用哪些种类?目前使用的是DES。
RSA ,MD5,SHA1
5:加密后,以后要注意哪些事宜。
保证钥匙不能掉。

6,129

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 新技术前沿
社区管理员
  • 新技术前沿社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧