数据库加密技术总结(MD5加密,哈希加盐加密)

       数据库加密系统是一款基于透明加密技术的数据库防泄漏系统,该产品能够对数据库中的敏感数据加密存储,访问控制增强,应用访问安全,安全审计以及三权分立等功能。

一个好的数据库加密系统,应该在保证数据安全的基础上,尽可能的提高工作效率,在工作效率和安全性之间取得一个平衡。总体来说满足以下条件:

  • 加解密速度要求足够快,这样能够减少影响数据操作响应时间。
  • 加密强度足够大,保证大部分数据长时间不被破译。但是在实际应用中加密算法不一定在理论上无法破解,但在实际应用中应能保证破解密文的代价大于获取其中数据的意义。
  • 对数据库的合法用户来说加解密操作是透明的,他不会影响用户的合理操作。换句话说,若某用户在明文数据库系统中能够进行更新,增加,删除数据,那么在密文数据库中也可以用相同的方法增加,更新和删除数据,用户不关心数据如何完成加解密。
  • 加密后的数据库,存储量不能有较大程度的增加。
  • 密钥管理方案灵活,高效,密钥安全存储,使用方便可靠。众所周知,加密算法本身并不保密,所以要确保数据的安全性通常取决于密钥的安全性。

数据库加密的主要方法:

(1)MD5加密算法

​       在现阶段,我们一般认为存在两种加密方式,单向加密和双向加密。双向加密是加密算法中最常用的,它将我们可以直接理解的明文数据加密为我们不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文。双向加密适合于隐秘通讯,比如,我们在网上购物的时候,需要向网站提交信用卡密码,我们当然不希望我们的数据直接在网上明文传送,因为这样很可能被别的用户“偷听”,我们希望我们的信用卡密码是通过加密以后,再在网络传送,这样,网站接受到我们的数据以后,通过解密算法就可以得到准确的信用卡账号。

        单向加密刚好相反,只能对数据进行加密,也就是说,没有办法对加密以后的数据进行解密。可能我们立即就会想,这样的加密有什么用处?不能解密的加密算法有什么作用呢?在实际中的一个应用就是数据库中的用户信息加密,当用户创建一个新的账号或者密码,他的信息不是直接保存到数据库,而是经过一次加密以后再保存,这样,即使这些信息被泄露,也不能立即理解这些信息的真正含义。

       MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。

        MD5CyptoServiceProvider类是.NET中System.Security.Cryptography名字空间的一个类,提供专门用于MD5单向数据加密的解决方法,也是本文中我们用来加密数据库中密码的类。在真正进行数据加密之前,我们首先来了解MD5CyptoServiceProvider类中的主要方法:ComputeHash,它将输入的明文数据数组使用MD5加密以后输出加密后的密文数据数组。

使用加密方式保存到数据库的限制:

​        在决定是否使用加密方式保存密码之前,我们还要考虑一些问题,因为MD5是单次加密算法,加密以后的信息不可以解密,所以,如果用户丢失密码,任何人都很难找到用户原来的密码,这时候,网站也就相应的失去一个很重要的功能,那就是用户提供其他信息来取得忘记的密码的功能,这不能不说是网站的一个大缺陷。另外,采用这样的加密方式,必须完全修改以前的用户资料,要求用户完全重新注册,这也是这种方法比较困难的一个地方。

(2)密码加密:哈希加盐

一般系统数据库密码加密方式:

  • MD5后存入数据库
  • SHA1 Hash后存入数据库

缺点:黑客可以通过密码暴力破解获取密码信息,具体做法是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。

建议:使用以下两种密码策略相结合的方式去解决

  • 密码 + 盐(一串随机数) 再Hash
  • 限制密码最小长度和密码复杂度

解释:以上给每个密码加一个随机数后,实际上是将密码人为地拓展了N位,导致密码长度大增,使得攻击者很难很难构造这么大的一个字典去破解。退一步讲,就算攻击者的字典足够强大但是暴力破解所需要花费的时间代价过长从而降低了这种风险。

// 1.指定加密算法
MessageDigest digest = MessageDigest.getInstance("MD5");
// 2.将需要加密的字符串转化成byte类型的数据,然后进行哈希过程
byte[] bs = digest.digest((psd + salt).getBytes());
// 3.遍历bs,让其生成32位字符串,固定写法

你可能感兴趣的:(MySQL,数据安全,MD5加密,哈希加盐)