前端开发中的密码学问题

密码学

  1. 概念:密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。维基百科
  2. 为什么会有密码?小到藏私房钱,偷画隔壁小妹妹,大到国家信息防泄漏。密码设计的好,别人偷到你的秘密信息的几率就越低。看过谍战片的朋友应该都见过一些密码学的东西,比如二战时的电报密码等
  3. 程序编程中的密码学,网络通信的安全更是重中之重,老大难的问题,前端开发中也难免不会碰到安全问题。
  4. 密码碰撞:密码A的md5加密:md5(A)和密码B的md5加密:md5(B)的结果相等。用户甲自己设置的是密码A,但是黑客乙用一系列密码(包含B)逐个测试,最后发现密码B也也可以进入A的账户,就可以说密码B碰撞成功
  5. md5加盐:用户自己设置的静态密码(一段时间内不会发生改变的密码)和服务器校验时用的动密码拼接后在加密,提高密码复杂度,称为md5加盐。sha1加盐也一样
  6. 密码破译成本:指破译一个密码需要的计算量(消耗的精力)和消耗的时间的多少。随着计算机的发展,密码破译成本逐渐转为:内存占用成本(md5、sha1等映射存储)、硬件消耗成本和时间成本。举个简单的栗子:一个小偷想破译一个卖菜大婶的保险柜密码(假设可以让他破译无数次),所有可能的密码有2^32次方(32字节的安全密码,约3.4x10^32)次,每次碰撞需要消耗0.3毫秒,那么消耗的时间可能为:Math.pow(2,32) * 0.3 / 1000 / 3600 / 24 / 365 约等于 15 天,那么在准备破译这个密码时,他就要考虑最坏结果,可能让他的电脑日夜工作半个月才能破译这个密码,还得保证人家不改密码,这个成本就有点儿太高了,明智的黑客都不会选择去破译这个密码,除非有特殊需求

做前端开发,为什么我要了解密码学

  1. 如果这个世界上没人想知道其他人的小秘密,那就不需要密码 => 我也就不需要了解密码学咯
  2. 如果这个世界上没有黑客(想尽一切办法去破解别人的小秘密的人群也暂且给你们一定高帽子哦),那么简单的密码就可以保证我们的信息安全 => 我也不需要了解密码学
  3. 如果我不在乎别人破译我的个人密码和我自己开发的软件系统,破罐子破摔的 => 我还不如不设置密码!
  4. 以上三种情况都不符合我和这个世界,那么我就了解下咯

先抛出几个概念

  1. 绝对安全的密码?:不存在的,所有密码都可能被碰撞或者被破解
  2. 黑客可以破解所有的密码?:不存在的,除非他的寿命无限长,否则总有密码他没破解就老死的
  3. 6位数的密码不可靠?:不一定的,有的系统会给你加salt,使你的密码复杂度提高很多
  4. 别人给我的密码加盐,我是不是可以随便设置简单的密码?:安全防护还是要自己来做的,你能确定人家给你加的不是静态盐(下面会讲静态盐的危害)?

常用的前端加密

  1. MD5、sha1加密

    • 使用场景:用户登录界面、信息验证界面
    • 使用方法:md5(password) 将用户密码转换为一个大于(或等于)128字节的无序密码,后端存储加密后的字符串或者原密码,通过比较加密后的密码是否相同来验证密码是否正确
    • 特点:单向性,只能加密,无法解密(现有的解密方法是通过碰撞来实现的映射库)。长度固定
    • 实现原理:这个实现很复杂,涉及很多二进制位运算,这里就不过多解释(其实我是看不懂!)
    • 破解方法:碰撞破解
      第一步:建立一个大型的数据库,把日常的各个语句,通过MD5加密成为密文,不断的积累大量的句子,放在一个庞大的数据库里.
      第二步:比如一个人拿到了别人的密文,想去查询真实的密码,就需要那这个密文去到提供这个数据库的公司网站去查询.
      
  2. MD5、sha1优雅的使用方法:secretCode + saltKey 俗称“加盐”
    • 使用场景:用户登录界面、信息验证界面
    • 使用方法:根据用户名从服务端拿到对应的salt (一般是动态的,静态的salt下面在详述),将salt和password拼接在一起,加密拼接的字符串,后端验证服务端的密码和salt拼接加密后的密码是否和前端传过来的密码一致来判断密码是否正确
    • 特点:单向性,只能加密无法解密。复杂度几何倍数增加:通过碰撞找到原密码的几率增加2的128次方倍(MD5)和2的160次方倍(sha1),使密码被破译的几率减小很多
    • 静态盐:指服务端给用户创建的salt是静态的,不论过去多长时间都不会发生改变,严格来说,这种就等于没有加盐,用碰撞来破解这个密码依然只需要碰撞出 你的密码+固定盐这个集合就可以,既没有增加破解时间,也没有增加破解次数上限,所以静态盐不具备aslt的基本功能
    • 加盐:再来说下这个概念,salt必须为服务端动态生成或每隔一段时间就改变一次的,否则就像上面的解释,加盐跟没加几乎一样
  3. js异或加密解密

    • 使用场景:敏感数据交互。代码或文件加密。恶搞,单纯的想让黑客小朋友走几步弯路
    • 实现原理:如果 A^B=C, 那么 A^C=B 和 B^C=A都是成立的

      // js的位异或运算符`"^"`
      // 对称位数上的数字都是0或者1,则为0,一个为0一个为1则为1
      // 例如:
      8 ^ 3 // 输出 11
      // 用二进制运算就是:(0b表示后面跟的是二进制编码的字符)
      0b1000^0b0011 == 0b1011 // 返回 true
      // 反过来:
      11^3 == 8 // true
      0b1011^0b0011 == 0b1000 // true
      11^8 == 3 // true
      0b1011^0b1000 == 0b0011 // true
      // 根据这个规则,就可以实现位异或运算的加解密了:真实密码A和密钥B生成 加密字符串:A^B 记为 C
      // 甲把密钥B告诉乙,再把C传给乙,乙就可以用 C^B 翻译出真实密码A
      // 不知道密钥的黑客丙想破解甲的真实密码A,他需要拿C去跟很多种可能的密钥进行碰撞,只要密钥的长度够长,并可能需要花几百年去破解
      
      // 示例
      function secret (key, str) {
        let finalSecret = ''
        let midSecret = ''
        key += ''
        str += ''
        for(let i = 0; i < str.length; i ++) {
          for(let j = 0; j < key.length; j ++) {
            midSecret = str.charCodeAt(i) ^ key.charCodeAt(j)
          }
          finalSecret += midSecret
        }
        return finalSecret
      }
      
      // 密钥:‘hello’,加密:‘world’
      secret('hello', 'world') // "24029311"
      // 解密
      secret('hello', '24029311') // world
    • 特点:可实现加解密,设置足够大的密钥可以生成复杂度极高的加密密码,但对应的加解密时间也会增加

  4. bash64加密

    • 使用场景:电子邮件、网络证书传递、url地址传递等
    • 使用方法:

      // 先引入base64.js,获取到Base64对象
      // 使用`Base64.encode(str)`方法进行加密
      Base64.encode('admin') // "YWRtaW4="
      // 使用`Base64.decode(str)`方法进行解密
      Base64.decode("YWRtaW4=") // "admin"
    • 实现原理:用6个字节表示一个字符,替代传统的8字节一个字符,超出的字节会放入下一个base64字符中,对应的3个字符会转为4个base64字符。而不够3个字符的情况会自动用=填充一个base64“空”字符,例如:

      // 加密字符a
      Base64.encode('a') // "YQ=="
      // 第一步: a 的二进制表示为: 00001010
      // 第二步: 转换为Base64编码时,不够3字节,那么先给后面补上2字节的空字符: 00001010 00000000 00000000
      // 第三步: 开始转换base64编码:第一个字符: 000010 第二个字符:100000 第三个和第四个都为 000000 保证对应的二进制位数不变
      // 第四步: 查base64的二进制映射表,映射为对应的base64字符: 第一个:Y,第二个:Q,第三个和第四个都是空字符,在base64中用“=”表示空字符,加密结果:YQ== 
    • 特点:可加解密,可对ASCII编码0-128的隐藏字符进行编码传输,避免有些隐藏字符在网络传输中丢失

你可能感兴趣的:(前端小知识)