zoukankan      html  css  js  c++  java
  • SQL Server 2005 数据加密

    加密是为了保证敏感数据的安全性,如用户密码,银行卡密码等信息。

    1.最简单的加密方式就是对单个字符,某列的加密,利用HashBytes 返回输入的哈希值。语法:HashBytes('加密类型','加密文本') 返回值最大为varbinary(8000)

    以下示例前提为已安装AdventureWorks示例数据库.
    --创建示例表,填充数据
    set nocount on;
    select CreditCardID,CardNumber into dbo.t1 from Sales.CreditCard;
    go
    --添加列,以便存储对卡号加密后的Hash值
    alter table dbo.t1 add md2Number varbinary(20null;
    alter table dbo.t1 add md4Number varbinary(20null;
    alter table dbo.t1 add md5Number varbinary(20null;
    alter table dbo.t1 add shaNumber varbinary(20null;
    alter table dbo.t1 add sha1Number varbinary(20null;
    go
    --加密
    update dbo.t1 set
        md2Number = HashBytes('md2',CardNumber),
        md4Number = HashBytes('md4',CardNumber),
        md5Number = HashBytes('md5',CardNumber),
        shaNumber = HashBytes('sha',CardNumber),
        sha1Number = HashBytes('sha1',CardNumber);
    go
    select  top (10*  from dbo.t1;


    Point:结果中可以看出sha,sha1这两种加密的结果一样的。HashBytes加密是不可逆的,也就是说只能修改,但是不能找回加密前的值。
    varchar 类型字符,与nvarchar类型的字符返回的Hash值是不一样的(理由:占用字节不一样)如:
    select HashBytes('md5','SQL Server 2005'as md5varchar, HashBytes('md5',N'SQL Server 2005'as md5nvarchar;
     
    2.通行短语加密 优点可以解密,安全性比Hash加密更高,缺点,如果忘了通行短语就没救了
    --填充数据
    set nocount on;
    select CreditCardID,CardNumber into dbo.t2 from Sales.CreditCard;
    go
    --添加存储加密后的列
    alter table dbo.t2 add PhraseNumber varbinary(256null;
    go
    --加密
    update dbo.t2 set PhraseNumber = EncryptByPassPhrase('phrasetext',CardNumber,1,convert(varbinary(30),CreditCardID));
    go
    --查看加密后的结果
    select * from dbo.t2;
    go

    --解密
    select CreditCardID,CardNumber,PhraseNumber,
        convert(nvarchar,DecryptByPassphrase('phrasetext',PhraseNumber,1,convert(varbinary(30),CreditCardID))) as "Decrypted card number"
    from dbo.t2;
    go
     
     
    3, 证书公钥加密  优点:密码更复杂,安全, 缺点:开销大,还得维护证书
    --创建自我签名的证书,证书的一种,该例主要讲述加密,有关其他证书类型关注以后的文章
    create certificate cer001
        encryption by password = N'!@#$%^&*'
        with subject = 'cer_encryption',
        start_date = '20111101',
        expiry_date = '20120101';
    go

    --填充数据
    set nocount on;
    select CreditCardID,CardNumber into dbo.t3 from Sales.CreditCard;
    go
    --添加存储加密后的列
    alter table dbo.t3 add CerEncryptionENumber varbinary(256null;
    go
    --查看未加密结果
    select * from dbo.t3;
    go
    --加密
    update dbo.t3 set CerEncryptionENumber = EncryptByCert(Cert_ID('cer001'),CardNumber);
    go
    --查看加密后结果
    select * from dbo.t3;
    go

    --查看解密后结果
    select top (10) CardNumber as '原始卡号',
        convert(nvarchar(30), DecryptByCert(Cert_Id('cer001'),CerEncryptionENumber,N'!@#$%^&*')) as '解密后'
    from dbo.t3;
    go
     
     
     
    4 非对称密钥加密,解密  缺点:开销大,不要在处理大型数据集使使用
    create asymmetric key  asym_key_001
    with algorithm = RSA_2048 
    encryption by password = N'!@#$%^&*';
    go
    --填充数据
    set nocount on;
    select CreditCardID,CardNumber into dbo.t4 from Sales.CreditCard;
    go
    --添加存储加密后的列
    alter table dbo.t4 add AsymKeyEncryptionENumber varbinary(256null;
    go
    --查看未加密结果
    select * from dbo.t4;
    go
    --加密
    update dbo.t4 set AsymKeyEncryptionENumber = EncryptByAsymKey(AsymKey_ID('asym_key_001'),CardNumber);
    go
    --查看加密后结果
    select * from dbo.t4;
    go

    --查看解密后数据
    select CardNumber, convert(nvarchar(30),DecryptByAsymKey(AsymKey_Id('asym_key_001'), AsymKeyEncryptionENumber, N'!@#$%^&*' 

    )) as DecryptedData 
    from dbo.t4;
    go
     
     
    5 对称密钥加密,解密  指定的算法必须在操作系统中,加密,解密速度快, 解密语法简单
    --使用 DESX 算法创建名为 sym_key_001 的对称密钥,然后使用证书 cer001 对新密钥进行加密。
    create symmetric key  sym_key_001
    with algorithm = DESX
    encryption by certificate cer001;
    go
    --填充数据
    set nocount on;
    select CreditCardID,CardNumber into dbo.t5 from Sales.CreditCard;
    go
    --添加存储加密后的列
    alter table dbo.t5 add SymKeyEncryptionENumber varbinary(256null;
    go
    --查看未加密结果
    select * from dbo.t5;
    go
    --加密
    open symmetric key  sym_key_001 decryption by certificate cer001 with password = N'!@#$%^&*';
    update dbo.t5 set SymKeyEncryptionENumber = EncryptByKey(Key_GUID('sym_key_001'),CardNumber);
    go
    --查看加密后结果
    select * from dbo.t5;
    go

    --查看解密后数据
    open symmetric key  sym_key_001 decryption by certificate cer001 with password = N'!@#$%^&*';
    select CardNumber, SymKeyEncryptionENumber,convert(nvarchar(30),DecryptByKey(SymKeyEncryptionENumber)) as DecryptedData 
    from dbo.t5;
    go
     
  • 相关阅读:
    CentOS7 安装jdk8
    CentOS7 安装和配置 mysql5.7
    CentOS7 安装和配置Tomcat
    vi编辑器设置行号可见
    前端基础-css(2)
    前端基础-css(1)
    前端基础-html(3)
    前端基础-html(2)
    前端基础-html(1)
    IO多路复用、协程
  • 原文地址:https://www.cnblogs.com/itboyblog/p/2260898.html
Copyright © 2011-2022 走看看