zoukankan      html  css  js  c++  java
  • API安全(六)-密码加密

    1、密码为什么要加密

      存在数据库中的密码如果是明文,一旦数据库数据泄漏了,别人就可以拿着你的账号密码为所欲为。更何况有很多人在各个平台的用户名密码都是一致的。所以用户的密码,一定要加密存储。

    2、加密算法的种类

      2.1、对称加密,指的是需要对加密和解密使用相同密钥的加密算法。常见的对称加密算法有:DES、3DES、AES等。

      2.2、非对称加密,它需要两个密钥,一个称为公钥(public key),一个称为私钥(private key)。加密和解密使用两个不同的密钥。例如:甲生成一对密钥,并将其中的一把作为公钥向其他人公开,得到该公钥的乙使用该密钥对信息进行加密后在发送给甲,甲使用自己保存的另一把私钥,对加密后的信息进行解密。常见的非对称加密算法有RSA、DSA等。

      2.3、单向hash算法,就是把任意长的消息串转化为固定长度的输出串的一种算法。一般用户信息摘要。常见的有MD5、SHA、MAC等。

      2.4、加盐hash算法,盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

    3、密码加密的算法选择

      3.1、可逆的算法不要选,会增加密码泄漏的风险。

      3.2、MD5不要选,MD5并不是一个加密算法,而是一个信息摘要算法,可通过彩虹表进行破解,且相同明文加密后的密文是一致的,一旦破解出来一个,其余相同的也都知道了。

      3.3、不要加固定的盐,比如说用户名,邮箱等,如果数据库被攻破了,盐会被拿到。一旦盐泄漏,根据盐重新建立彩虹表可以进行破解。

    所以用于密码加密的算法最好是,不可逆的,且使用随机盐,常用做密码加密的算法有bcrypt、scrypt。

    4、使用bcrypt对密码进行加密(推荐使用)

      4.1、导入依赖

    <dependency>
        <groupId>org.mindrot</groupId>
        <artifactId>jbcrypt</artifactId>
        <version>0.4</version>
    </dependency>

      4.2、对密码进行加密

        @Override
        @Transactional(rollbackFor = Exception.class)
        public UserDTO create(UserDTO userDTO) {
            /*
             * 将密码加密成密文
             */
            userDTO.setPassword(BCrypt.hashpw(userDTO.getPassword(),BCrypt.gensalt()));
            UserDO userDO = new UserDO();
            BeanUtils.copyProperties(userDTO, userDO);
            userRepository.save(userDO);
            userDTO.setId(userDO.getId());
            return userDTO;
        }

      4.3、认证过滤器,修改密码校验方式

       4.4、创建两个用户,并使用相同的密码123456,查看数据库中存储的密码是不一致的

      4.5、测试认证功能

      这样,我们数据库中的密码就安全多了。

    5、使用scrypt对密码进行加密

      5.1、导入依赖

    <dependency>
        <groupId>com.lambdaworks</groupId>
        <artifactId>scrypt</artifactId>
        <version>1.4.0</version>
    </dependency>

      5.2、对密码进行加密

    userDTO.setPassword(SCryptUtil.scrypt(userDTO.getPassword(),2 << 14,8,1));

      5.3、认证过滤器,修改密码校验方式

      效果与使用bcrypt类似,该算法唯一的缺点就是慢。

    源码地址:https://github.com/caofanqi/study-security/tree/dev-encryption

    
    
  • 相关阅读:
    webpack 配置缓存
    Python-----多线程threading用法
    LINUX 编程定位工具gstack,pstack
    数据库session立即生效(64---8192) SCOPE参数
    shell中wait命令详解
    Go语言学习笔记
    使用go语言数据库
    Oracle数据库管理----性能优化
    数据库索引实例
    Linux串口设置及编程(转)
  • 原文地址:https://www.cnblogs.com/caofanqi/p/12238269.html
Copyright © 2011-2022 走看看