ado.net 如何加密连接数据库的账户和密码

ado.net 如何加密连接数据库的账户和密码,第1张

1创建一个RSA密钥容器

aspnet_regiis -pc "MyKeys" -exp

2授予aspnet标识对RSA容器的访问权限

aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

3在Webconfig 中指定加密保护提供程序(Provider)

<configuration>

<configProtectedData>

<add name="MyProvider"

type="SystemCofigurationRsaProtectedConfigurationProvider"

keyContainerName="MyKeys"

useMachineContainer="true" />

</configProtectedData>

</configuration>

4 加密<connectionStrings>节

aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "MyProvider"

5 导出RSA 密钥容器

aspnet_regiis -px "MyKeys" "c:\keysxml" -pri

6 删除RSA密钥容器

aspnet_regiis -pz "MyKeys"

7从XML中导入RSA 密钥容器

aspnet_regiis -pi "MyKeys" "c:\keysxml"

8授予aspnet标识对RSA容器的访问权限

aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

问题解决思路:

将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密 *** 作,达到成功创建连接池的目的。Tomcat默认使用DBCP连接池(基于common-pool的一种连接池实现),对orgapachecommonsdbcpBasicDataSourceFactory类修改,把数据库密码字段(加密后的密文)用解密程序解密,获得解密后的明文即可。

具体实现:

1 修改orgapachecommonsdbcpBasicDataSourceFactory类文件

找到数据源密码设置部分

value = propertiesgetProperty(PROP_PASSWORD);

if (value != null) {

dataSourcesetPassword(value);

}

修改为:

value = propertiesgetProperty(PROP_PASSWORD);

if (value != null) {

dataSourcesetPassword(Encodedecode(value));

}

将配置文件中的“密码”(加密后的结果)取出,调用加解密类中的解密方法Encodedecode(value)进行解密。

2 加密类Encodejava,本例中使用加密解密模块比较简单只是用来说明问题,密文为明文的十六进制串。

public class Encode {

//编码-普通字符串转为十六进制字符串

public static String encode(String password){

String result = “”;

byte[] psd = passwordgetBytes();

for(int i=0;i<psdlength;i++){

result += IntegertoHexString(psd[i]&0xff);

}

return result;

}

//解码–十六进制字符串转为普通字符串

public static String decode(String password){

String result = “”;

password = passwordtoUpperCase();

int length = passwordlength() / 2;

char[] hexChars = passwordtoCharArray();

byte[] d = new byte[length];

for (int i = 0; i < length; i++) {

int pos = i 2;

d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));

}

result = new String(d);

return result;

}

//字符转字节

public static byte charToByte(char c) {

return (byte) “0123456789ABCDEF”indexOf(c);

}

}

3 数据库连接池文件,红色字体为数据源配置中密码设置,此时已经改为密文形式。

<xml version=’10′ encoding=’utf-8′>

<Context docBase=”reportmis” path=”/reportmis” privileged=”true” workDir=”work\Catalina\localhost\reportmis”>

<Resource auth=”Container” name=”mis2datasource” type=”javaxsqlDataSource”/>

<ResourceParams name=”mis2datasource”>

<parameter>

<name>password</name>

<value>696e65743231</value>

</parameter>

<parameter>

<name>url</name>

<value>jdbc:oracle:thin:@127001:1521:orcl</value>

</parameter>

<parameter>

<name>driverClassName</name>

<value>oraclejdbcdriverOracleDriver</value>

</parameter>

<parameter>

<name>username</name>

<value>wanfang</value>

</parameter>

</ResourceParams>

</Context>

4 将修改后的BasicDataSourceFactoryjava和新添加的Encodejava编译后的class类文件重新打包进commons-dbcp-14jar,将该包拷贝进tomcat下的common/lib目录中,重启tomcat。此时tomcat下部署的应用在连接数据源的时候都可以在不暴露密码明文的情况下进行连接。

一般是先加盐再用不可逆加密算法加密密码的,常见的有:sha1 sha256 md5等。

作用:这些加密算法,只能加密,不能逆向解密,所以使用这些算法。即时你的数据库被拖库,得到的人,也无法知道用户密码。

为什么加盐

举例

在注册时,

假设你的密码是1234,一般服务器会加一个盐(随便一个乱打的字符串),和你的密码加在一起,1234和efnU(@#H!JKNF得到1234efnU(@#H!JKNF这个值,然后再进行加密(这里我用md5)得到 91dc02c1fc2ce2252969e6b86173aa78,于是数据库里你的密码就变为了91dc02c1fc2ce2252969e6b86173aa78

登入时,

你输入1234, 然后服务器用和注册相同的步骤进行加密,得到加密后的值,91dc02c1fc2ce2252969e6b86173aa78,将这个值与数据库的加密值比对,如果正确则登入。

一、数据库加密是什么?

数据库加密技术属于主动防御机制,可以防止明文存储引起的数据泄密、突破边界防护的外部黑客攻击以及来自于内部高权限用户的数据窃取,从根本上解决数据库敏感数据泄漏问题。数据库加密技术是数据库安全措施中最顶级的防护手段,也是对技术性要求最高的,产品的稳定性至关重要。

二、数据库加密的方式有哪些?

目前,不同场景下仍在使用的数据库加密技术主要有:前置代理加密、应用系统加密、文件系统加密、后置代理加密、表空间加密和磁盘加密等,下文将对前四种数据加密技术原理进行简要说明。

1、前置代理加密技术

该技术的思路是在数据库之前增加一道安全代理服务,所有访问数据库的行为都必须经过该安全代理服务,在此服务中实现如数据加解密、存取控制等安全策略,安全代理服务通过数据库的访问接口实现数据存储。安全代理服务存在于客户端应用与数据库存储引擎之间,负责完成数据的加解密工作,加密数据存储在安全代理服务中。

2、应用加密技术

该技术是应用系统通过加密API(JDBC,ODBC,CAPI等)对敏感数据进行加密,将加密数据存储到数据库的底层文件中;在进行数据检索时,将密文数据取回到客户端,再进行解密,应用系统自行管理密钥体系。

3、文件系统加解密技术

该技术不与数据库自身原理融合,只是对数据存储的载体从 *** 作系统或文件系统层面进行加解密。这种技术通过在 *** 作系统中植入具有一定入侵性的“钩子”进程,在数据存储文件被打开的时候进行解密动作,在数据落地的时候执行加密动作,具备基础加解密能力的同时,能够根据 *** 作系统用户或者访问文件的进程ID进行基本的访问权限控制。

4、后置代理技术

该技术是使用“视图”+“触发器”+“扩展索引”+“外部调用”的方式实现数据加密,同时保证应用完全透明。核心思想是充分利用数据库自身提供的应用定制扩展能力,分别使用其触发器扩展能力、索引扩展能力、自定义函数扩展能力以及视图等技术来满足数据存储加密,加密后数据检索,对应用无缝透明等核心需求。

三、数据库加密的价值

1、在被拖库后,避免因明文存储导致的数据泄露

通常情况下,数据库中的数据是以明文形式进行存储和使用的,一旦数据文件或备份磁带丢失,可能引发严重的数据泄露问题;而在拖库攻击中,明文存储的数据对于攻击者同样没有任何秘密可言——如Aul、MyDul等很多成熟的数据库文件解析软件,均可对明文存储的数据文件进行直接分析,并输出清晰的、结构化的数据,从而导致泄密。

数据库加密技术可对数据库中存储的数据在存储层进行加密,即使有人想对此类数据文件进行反向解析,所得到的也不过是没有任何可读性的“乱码”,有效避免了因数据文件被拖库而造成数据泄露的问题,从根本上保证数据的安全。

2、对高权用户,防范内部窃取数据造成数据泄露

主流商业数据库系统考虑到初始化和管理的需要,会设置以sys、sa或root为代表的数据库超级用户。这些超级用户天然具备数据访问、授权和审计的权限,对存储在数据库中的所有数据都可以进行无限制的访问和处理;而在一些大型企业和政府机构中,除系统管理员,以数据分析员、程序员、服务外包人员为代表的其他数据库用户,也存在以某种形式、在非业务需要时访问敏感数据的可能。

数据库加密技术通常可以提供独立于数据库系统自身权限控制体系之外的增强权控能力,由专用的加密系统为数据库中的敏感数据设置访问权限,有效限制数据库超级用户或其他高权限用户对敏感数据的访问行为,保障数据安全。

方法步骤:

1 首先,以独占方式打开你要加密的数据库。打开方法如图:

2 打开后,点“文件”--“信息”,在关于你这个数据库的信息页面,有“用密码进行加密”一项。

3 点击这一项,d出的就是设置密码框了

4 确定后,以后打开或连接该数据库,都要使用你设置的密码了。

#region DES加密字符串

/// <summary>

/// 加密字符串

/// 注意:密钥必须为8位

/// </summary>

/// <param name="strText">字符串</param>

public string DesEncrypt(string strText)

{

byte[] byKey = null;

byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

try

{

string encryptKey = "XX_XX_XX"; //密钥

byKey = SystemTextEncodingUTF8GetBytes(encryptKey);

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

byte[] inputByteArray = EncodingUTF8GetBytes(strText);

MemoryStream ms = new MemoryStream();

CryptoStream cs = new CryptoStream(ms, desCreateEncryptor(byKey, IV), CryptoStreamModeWrite);

csWrite(inputByteArray, 0, inputByteArrayLength);

csFlushFinalBlock();

return ConvertToBase64String(msToArray());

}

catch

{

}

return strText;

}

#endregion

#region DES解密字符串

/// <summary>

/// 解密字符串

/// </summary>

/// <param name="inputString">加了密的字符串</param>

public string DesDecrypt(string inputString)

{

byte[] byKey = null;

byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

byte[] inputByteArray = new Byte[inputStringLength];

try

{

string decryptKey = "XX_XX_XX";

byKey = SystemTextEncodingUTF8GetBytes(decryptKeySubstring(0, 8));

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

inputByteArray = ConvertFromBase64String(inputString);

MemoryStream ms = new MemoryStream();

CryptoStream cs = new CryptoStream(ms, desCreateDecryptor(byKey, IV), CryptoStreamModeWrite);

csWrite(inputByteArray, 0, inputByteArrayLength);

csFlushFinalBlock();

SystemTextEncoding encoding = new SystemTextUTF8Encoding();

return encodingGetString(msToArray());

}

catch

{

}

return inputString;

}

#endregion

===这个是DES方式加密解密字符串的

SystemSecurityCryptographyMD5CryptoServiceProvider md5=new SystemSecurityCryptographyMD5CryptoServiceProvider();

return ConvertToBase64String(md5ComputeHash(SystemTextEncodingUnicodeGetBytes(yourstring)));

===这个是MD5的

实现代码也给你写好了,希望能对你有帮助

以上就是关于ado.net 如何加密连接数据库的账户和密码全部的内容,包括:ado.net 如何加密连接数据库的账户和密码、如何实现Tomcat连接池数据库密码加密、数据库里加密的密码是怎么实现的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9659416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存