zoukankan      html  css  js  c++  java
  • 密码安全

    密码安全

    密码的作用---证明是你
    密码的存储
    密码的传输
    密码的替代方案
    生物特征密码的问题

    密码-泄露渠道

    • 数据库被偷
    • 服务器被入侵
    • 通讯被窃听
    • 内部人员泄露数据库
    • 其它网站(撞库)

    密码-存储

    • 严禁明文存储(防泄漏)
    • 单向变换(防泄漏)
    • 变换复杂度要求(防猜解)
    • 密码复杂度要求(防猜解)
    • 加盐(防猜解)

    密码-哈希算法

    • 明文-密文---一一对应
    • 雪崩效应
    • 密文明文 无法反推
    • 密文固定长度
    • 常见哈希算法:md5,sha1,sha256

    加密次数越多,复杂度越大,就越可以对抗彩虹表

    密码-变换次数越多越安全

    • 加密成本几乎不变(生成密码时速度慢一些,但对破解者是致命的)
    • 彩虹表失效(数量太大,无法建立通用性)
    • 解密成本增大 N 倍

    传说以前出现密码明文存储被泄露的案例(无法确定)

    加密

    var password = {};
    var md5 = function(str) {
        var crypto = require('crypto');
        var md5Hash = crypto.createHash('md5');
        md5Hash.update(str);
        return md5Hash.digest('hex');
    };
    
    password.getSalt = function() {
        return md5(Math.random()*99999+''+new Data().getTime());
    }
    
    password.encryptoPassword = function(salt, password) {
        return md5(salt + 'af@#$%^asda&' + password);
    }
    module.exports = password;
    

    密码验证

    // 如果用户没有salt,需要升级
    if (!user.salt) {
      var salt = password.getSalt();
      var newPassword = password.encryptPassword(salt, user.password);
      await query(
        `update user set password = '$(newPassword)', salt = '${salt} where id = ${user.id}'`
      );
      user.salt = salt;
      user.password = newPassword;
    }
    var encryptPassword = password.encryptPassword(user.salt, data.password);
    if (encryptPassword !== user.password) {
      throw new Error("密码不正确");
    }
    

    密码传输的安全性

    • https 传输
    • 频率限制
    • 前端加密意义有限

    在前端加密需要安装js-md5模块,运行jspm install node:js-md5

    前端进行加密,这是前后端要有相同的盐 SUGAR

    var SUGAR = "!@#¥@#@¥#¥%GDF456¥%";
    daat.password = md5(data.username + SUGAR + data.password);
    
    var password = {};
    var md5 = function(str) {
        var crypto = require('crypto');
        var md5Hash = crypto.createHash('md5');
        md5Hash.update(str);
        return md5Hash.digest('hex');
    };
    
    password.getPasswordFromText = function(username, password) {
       var SUGAR = '!@#¥@#@¥#¥%GDF456¥%';//与前端一致
       return md5(username+ SUGAR + password);
    };
    
    password.getSalt = function() {
        return md5(Math.random()*99999+''+new Data().getTime());
    }
    
    password.encryptoPassword = function(salt, password) {
    
        return md5(salt + 'af@#$%^asda&' + password);
    }
    module.exports = password;
    
    if (!user.salt) {
      var salt = password.getSalt();
      var newPassword = password.getPasswordFromText(user.username, user.password);
      var encryptedPassword = password.encryptPassword(salt, newPassword);
      await query(
        `update user set password = '$(newPassword)', salt = '${salt} where id = ${user.id}'`
      );
      user.salt = salt;
      user.password = encryptedPassword;
    }
    var encryptPassword = password.encryptPassword(user.salt, data.password);
    if (encryptPassword !== user.password) {
      throw new Error("密码不正确");
    }
    

    生物特征密码

    • 指纹(唇纹)
    • 声纹
    • 虹膜
    • 人脸

    生物特征密码

    • 私密性-容易泄露
    • 安全性-碰撞
    • 唯一性-终身唯一无法修改
  • 相关阅读:
    二、java基础-运算符_控制语句_break_continue_return
    一、Servlet之14道面试题
    Java程序员需要掌握的技能
    java内存溢出实战
    java虚拟机JVM基础
    常见数据结构与算法整理总结(下)
    常见数据结构与算法整理总结(上)
    Java实现八大排序算法
    23种设计模式图集
    引用iscroll的一个封装方法
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12245919.html
Copyright © 2011-2022 走看看