====对称加密(向量)=====

SQL Server 数据加密功效解析

 

转载自: 腾云阁 

数据加密是数据库被破解、物理介质被盗、备份被窃取的末尾一道防线,数据加密,壹方面缓解多少被窃取安全题材,另壹方面有关法律须要强制加密数据。SQL
Server
的数目加密相较于其它数据库,功效相对完善,加密措施较多。通常来讲,数据加密分为对称加密和非对称加密。对称加密:加密与解密使用同样密钥,密钥需求传输,安全性较弱,但品质较非对称要好。非对称加密:加密与解密使用不一样密钥(公钥和私钥),较对称密钥安全性较好,然而算法较复杂,带来品质上的损失。由此,折中的方法是应用对称密钥加密数码,使用非对称密钥加密对称密钥。那样既保证高质量,又进步密钥的可相信性。

同样,SQL Server 就动用了折中的方法,所以SQL
Server 加密功效包罗三个部分:数据加密和密钥管理

 

金沙注册送58, 

一.数码加密

多少加密成效解析,平常笔记。说道数据加密,大家不得不说下加密算法,SQL Server援助二种加密算法:

金沙注册送58 1

 

贰.密钥管理

一.SQL Server加密层次结构

金沙注册送58 2
由图能够见到,加密是分层级的。每3个数据库实例都拥有四个服务主密钥(ServiceMaster
Key),那么些密钥是实例的根密钥,在实例安装的时候自动生成,其本人由Windows提供的多寡爱慕API举办爱慕(Data
Pertection
API),服务主密钥除了为其子节点提供加密服务之外,还用于加密一些实例级别的音信,比如实例的报到名密码仍旧链接服务器的新闻。

在劳动主密钥之下的是数据库主密钥(Database Master
Key),这几个密钥由服务主密钥进行加密。这是三个数据库级其他密钥,能够用来为创设数据库级其余证书或非对称密钥提供加密,每二个数据库只可以有1个数据库主密钥。

EKM模块,那个相比较尤其,全称可扩展密钥管理模块,该作用增强sqlserver密钥管理的力量,允许将密钥存款和储蓄到数据库之外,包括部分硬件,如智能卡、USB设备或硬件安全模块(HSM);并且同意利用第3方产品来保管密钥和开始展览加密;其它,有规范的能够选择越来越高质量的HSM模块来加解密,减弱加解密上品质的损失。

 

贰.SQL Server加密格局

目的定义加密

未确认保障触发器、存款和储蓄进程、视图等概念音信,大家得以在概念sqlserver对象的时候添加WITH
ENCKoleosYPTION字段来加密对象。

 

列数据加密

由此函数加密表中的某壹列数据。能够通过密码、对称密钥、非对称密钥、证书等四中艺术加密。当中,还包涵带有验证器的加密函数,验证器用来化解密文替换难题,验证器1般选择不更改独一无贰的id,那样即使密文替换,验证器不对,壹样没戏。

 

连日来加密

因此证书的艺术对ssl连接加密,一般用于镜像,客户端和SQL
Server之间的连天正是通过那种艺术,幸免黑客窃取客户端和数据库之间的发送的多寡。

 

TDE透明数据加密(二〇一〇)

晶莹剔透数据加密,顾名思义,是在用户不感知的事态下落成加解密操作。
它的加密是在页级别进行,是在写入磁盘前加密,读入内部存款和储蓄器时解密,针对数据和日志文件,做到实时I/O加密,并且备份文件也会联合加密。
密钥存在数据库指导记录中,收到证件或然非对称密钥的掩护,也得以与EKM模块一同使用。官方说法,额外占用三%-5%的cpu能源。
TDE也有部分缺点:
压缩率小,由于它是先加密再压缩的,所以无法明显滑坡备份。
备份同样是加密的,全数恢复的时候要小心,注意备份证书和密钥,才能在另个实例中还原数据库
属性有自然损耗

 

备份加密(201四)

协理备份的进度中实行加密,并且援助先削减在加密,保持高压缩比,打破了应用透明数据加密后差不多从不压缩率的窘况。
就此,使用原生备份加密无论在将数据备份到异乡数据大旨,依旧将数据备份到云端,都能够以极低的资产对数码提供额外的安全保持。

 

全程加密AlwaysEncrypted(201陆)

全程加密,数据永远是加密事态,你能够在加密数据上实施操作,无需先对它们解密,约等于说加密的敏锐性新闻不会有机会变成明文。
全程加密针对列做处理,在创建列主密钥,列加密密钥后,可以在创设表的时候设置列加密。
加密形式分为二种:确定型加密与随机型加密。
鲜明型加密能够保证对有些值加密后的结果是始终相同的,那就允许使用者对该数量列进行等值相比较、连接及分组操作。鲜明型加密的欠缺在于有希望猜测出原作,而随机型加密能够确认保证有些给定值在自由四回加密后的结果再而三差异的,从而杜绝了猜出原值的恐怕。官方提议供给寻找和分组的列使用鲜明性加密,而注释和其余敏感不会展开检索分组的音信运用随机性加密。

 

便民md5加密:

        //SymmetricAlgorithm 所有对称算法的实现都必须从中继承的抽象基类
        private SymmetricAlgorithm mobjCryptoService;
        private string key;
        public Encrypt()
        {
            mobjCryptoService = new RijndaelManaged();
            key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";//自定义的密串
        }
        /// <summary>
        /// 获得密钥
        /// </summary>
        /// <returns>密钥</returns>
        private byte[] GetLegalKey()
        {
            string sTemp = key;
            mobjCryptoService.GenerateKey();// 当在派生类中重写时,生成用于该算法的随机密钥
            byte[] bytTemp = mobjCryptoService.Key;
            int KeyLength = bytTemp.Length;
            if (sTemp.Length > KeyLength)
                sTemp = sTemp.Substring(0, KeyLength);
            else if (sTemp.Length < KeyLength)
                sTemp = sTemp.PadRight(KeyLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
        /// <summary>
        /// 获得初始向量IV
        /// </summary>
        /// <returns>初试向量IV</returns>
        private byte[] GetLegalIV()
        {
            string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            mobjCryptoService.GenerateIV();
            byte[] bytTemp = mobjCryptoService.IV;// 获取或设置对称算法的初始化向量
            int IVLength = bytTemp.Length;//获得一个 32 位整数,表示 System.Array 的所有维数中元素的总数
            if (sTemp.Length > IVLength)
                sTemp = sTemp.Substring(0, IVLength);
            else if (sTemp.Length < IVLength)
                sTemp = sTemp.PadRight(IVLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
        /// <summary>
        /// 加密方法(请先实例化Encrypt类)
        /// </summary>
        /// <param name="Source">待加密的串</param>
        /// <returns>经过加密的串</returns>
        public string EncrypStrByIV(string Source)
        {
            byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
            MemoryStream ms = new MemoryStream();
            mobjCryptoService.Key = GetLegalKey();
            mobjCryptoService.IV = GetLegalIV();
            ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
            cs.Write(bytIn, 0, bytIn.Length);
            cs.FlushFinalBlock();
            ms.Close();
            byte[] bytOut = ms.ToArray();
            return Convert.ToBase64String(bytOut);
        }
        /// <summary>
        /// 解密方法(请先实例化Encrypt类)
        /// </summary>
        /// <param name="Source">待解密的串</param>
        /// <returns>经过解密的串</returns>
        public string DecrypStrByIV(string Source)
        {
            byte[] bytIn = Convert.FromBase64String(Source);
            MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
            mobjCryptoService.Key = GetLegalKey();
            mobjCryptoService.IV = GetLegalIV();
            ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
            StreamReader sr = new StreamReader(cs);
            return sr.ReadToEnd();
        }

金沙注册送58 3

数码加密是数据库被破解、物理介质被盗、备份被窃取的尾声一道防线,数据加密,一方面缓解数据被窃取安全题材,另一方面有关法规须要强制加密数据。SQL
Server
的数据加密相较于其它数据库,成效相对圆满,加密情势较多。通常来讲,数据加密分为对称加密和非对称加密。对称加密:加密与解密使用同样密钥,密钥需求传输,安全性较弱,但品质较非对称要好。非对称加密:加密与解密使用分歧密钥(公钥和私钥),较对称密钥安全性较好,不过算法较复杂,带来品质上的损失。因而,折中的方法是使用对称密钥加密多少,使用非对称密钥加密对称密钥。那样既有限补助高品质,又增强密钥的可相信性。

 ========DES加密========

百度md5加密:

1如既往,SQL Server 就应用了折中的方法,所以SQL Server
加密成效包罗二个部分:数据加密和密钥管理

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="Text">待加密的字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string DESEncrypt(string Text)
        {
            return DESEncrypt(Text, "ijnskijnse");
        }

        /// <summary> 
        /// DES加密数据 
        /// </summary> 
        /// <param name="Text">待加密的字符串</param> 
        /// <param name="sKey">加密密钥</param> 
        /// <returns>加密后的字符串</returns> 
        public static string DESEncrypt(string Text, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray;
            inputByteArray = Encoding.Default.GetBytes(Text);
            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                ret.AppendFormat("{0:X2}", b);
            }
            return ret.ToString();
        }




        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="Text">待解密的字符串</param>
        /// <returns>解密后的明文</returns>
        public static string DESDecrypt(string Text)
        {
            return DESDecrypt(Text, "ijnskijnse");
        }

        /// <summary> 
        /// DES解密数据 
        /// </summary> 
        /// <param name="Text">待解密的字符串</param> 
        /// <param name="sKey">解密密钥</param> 
        /// <returns>解密后的明文</returns> 
        public static string DESDecrypt(string Text, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            int len;
            len = Text.Length / 2;
            byte[] inputByteArray = new byte[len];
            int x, i;
            for (x = 0; x < len; x++)
            {
                i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
                inputByteArray[x] = (byte)i;
            }
            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            return Encoding.Default.GetString(ms.ToArray());
        }

金沙注册送58 4

壹.数据加密

 ====倒序加1加密解密====

 

钻探数据加密,大家只好说下加密算法,SQL Server援助各样加密算法:

 /// <summary>
        /// 倒序加1加密
        /// </summary>
        /// <param name="rs"></param>
        /// <returns></returns>
        public static string EncryptOrderStr(string rs) //倒序加1加密 
        {
            byte[] by = new byte[rs.Length];
            for (int i = 0; i <= rs.Length - 1; i++)
            {
                by[i] = (byte)((byte)rs[i] + 1);
            }
            rs = "";
            for (int i = by.Length - 1; i >= 0; i--)
            {
                rs += ((char)by[i]).ToString();
            }
            return rs;
        }
        /// <summary>
        /// 顺序减1解码 
        /// </summary>
        /// <param name="rs"></param>
        /// <returns></returns>
        public static string DecryptOrderStr(string rs) //顺序减1解码 
        {
            byte[] by = new byte[rs.Length];
            for (int i = 0; i <= rs.Length - 1; i++)
            {
                by[i] = (byte)((byte)rs[i] - 1);
            }
            rs = "";
            for (int i = by.Length - 1; i >= 0; i--)
            {
                rs += ((char)by[i]).ToString();
            }
            return rs;
        }

MySQL

金沙注册送58 5

======Base64编解码=====

加密码语言法

二.密钥管理:

        /// <summary>
        /// Base64编码
        /// </summary>
        /// <param name="code_type">编码类型</param>
        /// <param name="code">待编码的字符串</param>
        /// <returns></returns>
        public static string Base64Encode(string code_type, string code)
        {
            string encode = "";
            byte[] bytes = Encoding.GetEncoding(code_type).GetBytes(code);
            try
            {
                encode = Convert.ToBase64String(bytes);
            }
            catch
            {
                encode = code;
            }
            return encode;
        }
        /// <summary>
        /// Base64解码
        /// </summary>
        /// <param name="code_type">编码类型</param>
        /// <param name="code">带解码的字符串</param>
        /// <returns></returns>
        public static string Base64Decode(string code_type, string code)
        {
            string decode = "";
            byte[] bytes = Convert.FromBase64String(code);
            try
            {
                decode = Encoding.GetEncoding(code_type).GetString(bytes);
            }
            catch
            {
                decode = code;
            }
            return decode;
        }

MD伍(加密字符串)

一.SQL Server加密层次结构

 

 

金沙注册送58 6

-- 中文加密
SELECT MD5('你好')

-- 中文加密匹配查询
SELECT * FROM 表名 WHERE 字段名 = MD5('你好')

由图能够观察,加密是分层级的。每叁个数据库实例都怀有一个劳动主密钥(ServiceMaster
Key),那些密钥是实例的根密钥,在实例安装的时候自动生成,其本人由Windows提供的多少爱慕API实行维护(Data
Pertection
API),服务主密钥除了为其子节点提供加密服务之外,还用于加密壹些实例级其余消息,比如实例的登录名密码照旧链接服务器的音信。 

加密结果:

在劳动主密钥之下的是数据库主密钥(Database Master
Key),这几个密钥由劳务主密钥进行加密。那是多个数据库级别的密钥,能够用来为开创数据库级其余证书或非对称密钥提供加密,每2个数据库只可以有1个数据库主密钥。

金沙注册送58 7

EKM模块,那么些相比较尤其,全称可扩张密钥管理模块,该作用增强sqlserver密钥管理的力量,允许将密钥存款和储蓄到数据库之外,包含部分硬件,如智能卡、USB设备或硬件安全模块(HSM);并且同意采纳第二方产品来管理密钥和开始展览加密;其余,有规范的可以应用越来越高品质的HSM模块来加解密,减弱加解密上品质的损失。

 

2.SQL Server加密艺术

 

  • 指标定义加密

SQLSERVER

未确认保障触发器、存款和储蓄进程、视图等概念新闻,大家得以在概念sqlserver对象的时候添加WITH
ENCPAJEROYPTION字段来加密对象。

加密码语言法

  • 列数据加密
substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','加密字符串')),3,32)

由此函数加密表中的某一列数据。能够通过密码、对称密钥、非对称密钥、证书等肆中艺术加密。个中,还包涵带有验证器的加密函数,验证器用来消除密文替换难题,验证器1般选拔不更改独一无二的id,那样即使密文替换,验证器不对,一样没戏。

 

  • 再三再四加密
select substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','你好')),3,32)

透过证书的办法对ssl连接加密,一般用来镜像,主从机器此前的总是就是通过这种方法。

加密结果:

  • TDE(透明数据加密)

金沙注册送58 8

透明数据加密,顾名思义,是在用户不感知的意况下成功加解密操作。它的加密是在页级别进行,是在写入磁盘前加密,读入内部存储器时解密,针对数据和日志文件,做到实时I/O加密,并且备份文件也会壹起加密。密钥存在数据库引导记录中,收到证件或然非对称密钥的掩护,也得以与EKM模块1同使用。官方说法,额外占用三%-5%的cpu财富。
TDE也有部分通病:压缩率小,由于它是先加密再压缩的,所以不或者肯定滑坡备份。备份同样是加密的,全数恢复生机的时候要小心,注意备份证书和密钥,才能在另个实例中还原数据库品质有早晚损耗

猜想sqlserver加密与百度加密照旧有分其他.在不知情在sqlserver怎么加密时,照旧不要使用sqlserver加密。至于字母、数字、英文特殊字符仍是能够用sqlserver加密的。

  • 备份加密(201四)

 

援助备份的进度中进行加密,并且帮助先削减在加密,保持高压缩比,打破了应用透明数据加密后差不多从不压缩率的窘境。因而,使用原生备份加密无论在将数据备份到异乡数据核心,依然将数据备份到云端,都能够以相当的低的老本对数码提供额外的安全保持。

C# Md5加密:

  • 全程加密(201六)

加密代码:

全程加密,数据永远是加密事态,你能够在加密数据上实施操作,无需先对它们解密,也正是说加密的机敏音讯不会有机会变成明文。全程加密针对列做处理,在创造列主密钥,列加密密钥后,能够在创造表的时候设置列加密。加密形式分为两种:明显型加密与随机型加密。分明型加密能够确定保障对某些值加密后的结果是一味相同的,那就允许使用者对该数据列进行等值相比较、连接及分组操作。明确型加密的弱项在于有希望估计出原来的文章,而随机型加密能够确认保障有个别给定值在随意三遍加密后的结果总是区别的,从而杜绝了猜出原值的只怕性。官方建议供给寻找和分组的列使用明确性加密,而注释和其余敏感不会开始展览查找分组的新闻使用随机性加密。最终附上TDE开通示例: 

public static string Sign(string prestr, string _input_charset)
 {
     StringBuilder sb = new StringBuilder(32);
     System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
     byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(prestr));
     for (int i = 0; i < t.Length; i++)
     {
         sb.Append(t[i].ToString("x").PadLeft(2, '0'));
     }

     return sb.ToString();
 }

金沙注册送58 9

加密结果:

参照链接:

金沙注册送58 10

  • sqlserver加密:
  • 可扩展密钥管理模块EKM
  • 晶莹剔透数据加密TDE:

 

【编辑推荐】

 Java加密:

加密代码:

 

package com;

import java.security.MessageDigest;


public class Md5Test {

    public static void main(String[] args) {

        System.out.println(Md5("你好"));
    }

    public static String Md5(String str) {                            
        String re_md5 = new String();
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");

            byte[] data = str.getBytes("UTF-8");

            md.update(data);
            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }

            re_md5 = buf.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }

       return re_md5;
    }
}

 

加密结果:

金沙注册送58 11

 

相关文章

网站地图xml地图