Password-encryption

密码加密

  1. 用户密码在数据库中以明文形式存储,存在很大的安全隐患
  2. 密码加密的方式:
    1. 使用加密算法:
      1. 123456 -> 每个数字加1 -> 234567
      2. 加密算法主要为了保证数据传输阶段的安全,要求必须可以通过密文反推回明文
      3. 公司内部员工,在泄漏密文的同时,也可能泄漏加密算法和使用的参数,不法分子还是可以通过密文反推回明文
    2. 消息摘要算法:
      1. 消息一致的情况下,使用相同算法,生成的摘要一定一致
      2. 不管消息有多大,生成的摘要都是固定长度的
      3. 消息不一致的情况下,生成的摘要重复的概率非常低
        1. 以一个MD5算法为例,生成的摘要128位定长的2进制数据
      4. 虽然算法公开,但是只能通过消息生成摘要,但是无法通过摘要反推出消息,因为在计算过程中存在精度的缺失
      5. 常用的消息摘要算法:
        1. SHA:SHA1 SHA256 SHA384 SHA512
        2. MD: MD5
  3. 关于消息摘要算法的安全性
    • 是否可以通过密文反推回明文
      1. 利用“消息一致,摘要一定一致”的特点,在数据库中记录消息和摘要的对应关系
        1. 1位 70种可能 70个键值对
        2. 2位 70 * 70 4900
        3. 3位 5000 * 70 350000
        4. 4位 350000 * 70
        5. 以此类推,位数越多,需要穷举的键值对越多
    1. 如何提高密码的安全性:
      1. 要求用户使用强度更高的密码:P@ssw0rd,不容易被穷举到
      2. 多次加密
      3. 使用长度更长的消息摘要算法
      4. 加盐
        1. 普通字符串
        2. 加时间戳
        3. 加UUID
      5. 以上方法综合使用
  4. 利用代码实现数据摘要
    1. 利用DigestUtils的API实现,主要是MD5数据摘要算法
    2. 如果想要在编程中使用其他的数据摘要算法:
      1. 利用Java原生的工具类:MessageDigest.getInstance(“md5”);
      2. 利用commons-codec.jar:DigestUtils.进行各类消息摘要算法的计算