去评论
海欣资源

关于数据库中存储密码的加密

Spring
2022/06/19 17:41:05
关于密码加密

  基本原则: 存储到数据库中的密码必须加密处理!并且,必须使用不可逆的算法!并且,必须使用不可逆的算法!
  散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
  散列函数,顾名思义,它是一个函数。如果把它定义成 hash(key) ,其中 key 表示元素的键值,则 hash(key) 的值表示经过散列函数计算得到的散列值。
  一个哈希值对应着无数个明文
  所有的哈希算法都是不可逆的,其中,消息摘要算法都属于哈希算法!典型的消息摘要算法包括MD系列的和SHA家族的算法!
  由于消息摘要算法的摘要结果长度是固定的,所以,在用于加密时,如果没有做进一步处理,可能会被穷举的方式破解(破解方列举所有可能的密码与摘要,通过查询的
方式,根据密文找出原文).
  为了保障密码安全,基础的加强操作有:
    1.尽可能的要求用户使用长度更长的密码,并使用安全强度更高(有更多的字符组合)的密码
  上述代码主要测试Digest工具类中的md5DigestAsHex(String 明文)方法,用于给明文利用MD5算法进行加密获取到加密后的密文,存储到数据库中的数据就是此明文加密后的密文.
   2.多重加密

    3.加盐

此代码片段利用了加盐的方法,对密文等级进行提升,且加入的盐值可以是给定的值,也可以是利用UUID.randomUUID()得到的随机值.  UUID 是 通用唯一识别码(Universally Unique Identifier)
当使用了UUID时,盐值将会获得有且仅有一个的单独字段,这样做的情况下,明文将不能通过逆运算获得.
对于盐值的顺序是不固定的,可以md5(String 明文)的参数内加入多个盐值,注意盐值要是字符串的形式.
可以在控制台的输出中看出,实际上存储到数据库中的数据是(盐值+明文)通过DigestUtils工具类中的md5DigestAsHex加密算法加密获得的encodePassword.

    4.使用更加安全的算法(例如从MD5升级为SHA256甚至SHA-512)
  MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致.
SHA256算法使用的哈希值长度是256位。这是一个抽象类。此类的唯一实现是SHA256Managed。

    4.综合以上做法
  甚至,在使用盐时,还可以使用随机的盐值,但是,需要注意,如果使用了随机盐值,则这个随机盐值必须被记录下来(可以作为最终密文的一部分,或者在数据表中使用
单独的字段存储等),否则后续将无法正确的验证密码!