• 常用加密算法简单整理以及spring securiy使用bcrypt加密


    一.哈希加密

    1.md5加密

    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)

    https://baike.baidu.com/item/MD5/212708?fr=aladdin

    MD5算法具有以下特点:
    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的-128bit=32位16进制,例如e10adc3949ba59abbe56e057f20f883e
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
     
    1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念
    我觉得常说的盐应该就是safety-belts的缩写
    盐也就是向原文中加入的一串字符串,把明文盐和加密后的密码整合在一起存入数据库,至于怎么整合这里不去做过多研究.
     

    2.SHA-1

    SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数。

    正式名称为 SHA 的家族第一个成员发布于 1993年(比md5晚)。然而人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了

    SHA-0在发布之后很快就被NSA撤回,并且以 1995年发布的修订版本 FIPS PUB 180-1 (通常称为 "SHA-1") 取代。根据 NSA的说法,它修正了一个在原始算法中会降低密码安全性的错误。然而 NSA 并没有提供任何进一步的解释或证明该错误已被修正。1998年,在一次对 SHA-0 的攻击中发现这次攻击并不能适用于 SHA-1 — 我们不知道这是否就是NSA 所发现的错误,但这或许暗示我们这次修正已经提升了安全性。SHA-1已经被公众密码社群做了非常严密的检验而还没发现到有不安全的地方,它在一段时间被认为是安全的,直到Google宣布攻破SHA-1。

    http://www.chinaz.com/server/2017/0227/664383.shtml

     另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。

    SHA-0 和 SHA-1 会从一个最大 2^64 位元的讯息中产生一串 160 位元的摘要,然后以设计 MD4 及 MD5 讯息摘要算法的 MIT 教授Ronald L. Rivest类似的原理为基础来加密。

    NIST 发布了三个额外的 SHA 变体,每个都有更长的讯息摘要。以它们的摘要长度 (以位元计算) 加在原名后面来命名:"SHA-256", "SHA-384" 和 "SHA-512"。它们发布于 2001年.

    2004年2月,发布了一次 FIPS PUB 180-2 的变更通知,加入了一个额外的变种 "SHA-224",定义了符合双金钥 3DES 所需的金钥长度。(虽然长度一般,当时发布的晚肯定有它的价值)

    总结:SHA家族的摘要长度比MD5长,更安全,换来的代价是性能上的略微差异,不过相对安全而言,应该是值的的.

    3.PBKDF2

    PBKDF2简单而言就是将salted hash进行多次重复计算,这个次数是可选择的。如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟。假如攻击一个密码所需的rainbow table有1千万条,建立所对应的rainbow table所需要的时间就是115天。这个代价足以让大部分的攻击者忘而生畏。 美国政府机构已经将这个方法标准化,并且用于一些政府和军方的系统。 这个方案最大的优点是标准化,实现容易同时采用了久经考验的SHA算法。

    4.scrypt

    我觉得应该吧scrypt算在单向加密中,因为介绍中提到了彩虹表.

    scrypt是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的。

    scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table(hash对照表,详细不深究

    https://www.zhihu.com/question/19790488

    )进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。

     

    二.bcrypt和scrypt

    bcrypt是专门为密码存储而设计的算法,基于Blowfish加密算法变形而来,由Niels Provos和David Mazières发表于1999年的USENIX。 bcrypt最大的好处是有一个参数(work factor),可用于调整计算强度,而且work factor是包括在输出的摘要中的。随着攻击者计算能力的提高,使用者可以逐步增大work factor,而且不会影响已有用户的登陆。 bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。bcrypt也有广泛的函数库支持,因此我们建议使用这种方式存储密码。

    三.spring security提供的加密

    我不是安全人员,了解不同性能,安全需求下改用什么加密算法即可.

    从3.1.X(我也不太清楚具体哪个版本)开始,spring security已经不推荐使用sha1以及md5之类的加密算法了,

    新版本各种加密算法强度应该是scrypt>bscypt>pbkdf2>sha256(standard)

    性能的话正好相反.

    中小网站随便挑选,推荐用bcrypt

    我的开发环境是spring boot

    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    
        @Autowired
        private AuthenticationFailureHandler authenticationFailureHandler;
        @Autowired
        private AuthenticationSuccessHandler authenticationSuccessHandler;
    
        @Autowired
        private  UserDetailsService userDetailsService;
    
    
        public PasswordEncoder getPasswordEncoder()
        {
            return new BCryptPasswordEncoder(3);
        }
       @Bean
        public DaoAuthenticationProvider authProvider() {
            DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
            authProvider.setPasswordEncoder(getPasswordEncoder());
            authProvider.setUserDetailsService(userDetailsService);
            return authProvider;
        }
            @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            ValidateCodeFilter validateCodeFilter=new ValidateCodeFilter();
            validateCodeFilter.setAuthenticationFailureHandler(authenticationFailureHandler);
    
            http
                    .authorizeRequests()
                    .antMatchers("/**").permitAll()
                    .and()
                    .addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
                    .formLogin().loginPage("/login").loginProcessingUrl("/shop_login")
                    .failureHandler(authenticationFailureHandler)
                    .successHandler(authenticationSuccessHandler)
                    .and()
                    .csrf().disable();
        }
    }

    new BCryptPasswordEncoder(3)的参数length表示加密复杂度,重复处理的次数.

    默认为10,

    如果登录或者注册太慢,可以调整.或者选择standardpasswordencoder.

    http://blog.csdn.net/cloume/article/details/77856959

  • 相关阅读:
    【音视频】视频质量测试方向-标准
    解决苹果提审,APP Store看不到自家的App!!!
    【音视频】自研直播推流-流程概览
    【PyCharm】破解+汉化,一劳永逸
    jmeter+ant+jenkins 搭建接口自动化测试
    jenkins部署
    ruby File类
    ant + jmeter 自动化接口测试环境部署
    jmeter 插件安装
    ruby Logger日志
  • 原文地址:https://www.cnblogs.com/ptqueen/p/8448396.html
Copyright © 2020-2023  润新知