永德网站建设县城做网站的多么
- 作者: 五速梦信息网
- 时间: 2026年04月20日 06:58
当前位置: 首页 > news >正文
永德网站建设,县城做网站的多么,腾讯网站认证,个人网站开发公司目录 前言 一、登录认证密码加密 二、bcrypt加密密码不一样#xff0c;匹配原理 1.程序运行现象 2.原理解释 三、密码防重放 总结 前言 密码重放攻击#xff1a;请求被攻击者获取#xff0c;并重新发送给认证服务器#xff0c;从而达到认证通过的目的 一、登录认证密… 目录 前言 一、登录认证密码加密 二、bcrypt加密密码不一样匹配原理 1.程序运行现象 2.原理解释 三、密码防重放 总结 前言 密码重放攻击请求被攻击者获取并重新发送给认证服务器从而达到认证通过的目的 一、登录认证密码加密 Spring Security 中内置的加密算法BCrypt号称最安全的加密算法除了加盐来抵御rainbow table 攻击之外bcrypt的一个非常重要的特征就是自适应性可以保证加密的速度在一个特定的范围内即使计算机的运算能力非常高可以通过增加迭代次数的方式使得加密速度变慢从而可以抵御暴力搜索攻击。Bcrypt可以简单理解为它内部自己实现了随机加盐处理。使用Bcrypt每次加密后的密文是不一样的 public interface PasswordEncoder {String encode(CharSequence rawPassword);boolean matches(CharSequence rawPassword, String encodedPassword);default boolean upgradeEncoding(String encodedPassword) {return false;} }encode方法接受的参数是原始密码字符串返回值是经过加密之后的hash值hash值是不能被逆向解密的。这个方法通常在为系统添加用户或者用户注册的时候使用。 matches方法是用来校验用户输入密码rawPassword和加密后的hash值encodedPassword是否匹配。如果能够匹配返回true表示用户输入的密码rawPassword是正确的反之返回fasle。也就是说虽然这个hash值不能被逆向解密但是可以判断是否和原始密码匹配。这个方法通常在用户登录的时候进行用户输入密码的正确性校验。 upgradeEncoding设计的用意是判断当前的密码是否需要升级。也就是是否需要重新加密需要的话返回true不需要的话返回fasle。默认实现是返回false。 二、bcrypt加密密码不一样匹配原理 1.程序运行现象 public static void main(String[] args) {String passworld 12345;PasswordEncoder passwordEncoder new CustomBCryptPasswordEncoder();String encodePasswordOne passwordEncoder.encode(passworld);System.out.println(encodePasswordOne:encodePasswordOne);String encodePasswordTow passwordEncoder.encode(passworld);System.out.println(encodePasswordTow:encodePasswordTow);boolean matchesOne passwordEncoder.matches(passworld,encodePasswordOne);System.out.println(matchesOne:matchesOne);boolean matchesTow passwordEncoder.matches(passworld,encodePasswordTow);System.out.println(matchesTow:matchesTow);} 2.原理解释 a.Bcrypt就是一款加密工具可以比较方便地实现数据的加密工作。你也可以简单理解为它内部自己实现了随机加盐处理。例如我们使用MD5加密每次加密后的密文其实都是一样的这样就方便了MD5通过大数据的方式进行破解。Bcrypt生成的密文是60位的。而MD5的是32位的。使用BCrypt 主要是能实现每次加密的值都是不一样的 b.源码分析 1) 加密方法获取了随机盐放入BCrypt.hashpw加密方法中 public String encode(CharSequence rawPassword) {if (rawPassword null) {throw new IllegalArgumentException(rawPassword cannot be null);}String salt getSalt();return BCrypt.hashpw(rawPassword.toString(), salt);}private String getSalt() {if (this.random ! null) {return BCrypt.gensalt(this.version.getVersion(), this.strength, this.random);}return BCrypt.gensalt(this.version.getVersion(), this.strength);}
- 匹配方法matches-checkpw-hashpwhashpw方法把加密后的秘钥放入了随机盐的为止这个方法里面从密文里面获取了加密时的随机盐real_salt salt.substring(off 3, off 25);从而对新的密码用这个随机盐再加密进行匹配 public boolean matches(CharSequence rawPassword, String encodedPassword) {if (rawPassword null) {throw new IllegalArgumentException(rawPassword cannot be null);}if (encodedPassword null || encodedPassword.length() 0) {this.logger.warn(Empty encoded password);return false;}if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {this.logger.warn(Encoded password does not look like BCrypt);return false;}return BCrypt.checkpw(rawPassword.toString(), encodedPassword);}public static boolean checkpw(String plaintext, String hashed) {return equalsNoEarlyReturn(hashed, hashpw(plaintext, hashed));} public static String hashpw(byte passwordb[], String salt) {BCrypt B;String real_salt;byte saltb[], hashed[];char minor (char) 0;int rounds, off;StringBuilder rs new StringBuilder();if (salt null) {throw new IllegalArgumentException(salt cannot be null);}int saltLength salt.length();if (saltLength 28) {throw new IllegalArgumentException(Invalid salt);}if (salt.charAt(0) ! \( || salt.charAt(1) ! 2) {throw new IllegalArgumentException(Invalid salt version);}if (salt.charAt(2) \)) {off 3;}else {minor salt.charAt(2);if ((minor ! a minor ! x minor ! y minor ! b) || salt.charAt(3) ! \() {throw new IllegalArgumentException(Invalid salt revision);}off 4;}// Extract number of roundsif (salt.charAt(off 2) \)) {throw new IllegalArgumentException(Missing salt rounds);}if (off 4 saltLength 29) {throw new IllegalArgumentException(Invalid salt);}rounds Integer.parseInt(salt.substring(off, off 2));real_salt salt.substring(off 3, off 25);saltb decode_base64(real_salt, BCRYPT_SALT_LEN);if (minor a) {passwordb Arrays.copyOf(passwordb, passwordb.length 1);}B new BCrypt();hashed B.crypt_raw(passwordb, saltb, rounds, minor x, minor a ? 0x10000 : 0);rs.append(\(2);if (minor a) {rs.append(minor);}rs.append(\));if (rounds 10) {rs.append(0);}rs.append(rounds);rs.append($);encode_base64(saltb, saltb.length, rs);encode_base64(hashed, bf_crypt_ciphertext.length * 4 - 1, rs);return rs.toString();} 三、密码防重放 1.鉴于每次加密密码都不一样所以每次前端传过来的密码只能使用一次我们用redis的setnx功能来实现密码是否被二次使用 /*** 检查密码重放*/protected void checkReplayPassword(String ursername, String password) {String md5Pass EncryptionUtils.MD5.encrypt(password);boolean absent loginRecordService.savePassIfAbsent(ursername, md5Pass,securityProperties.getLogin().getPassReplayExpire(), TimeUnit.DAYS);if (absent) {throw new AuthenticationServiceException(LoginExceptions.DUPLICATE_PASSWORD.value());}} 总结 密码防重放攻击方案较多上述只是其中一种简单的防重放方案是建立在每次加密密码不一样的基础之上
- 上一篇: 硬件开发包网站内链优化的角度
- 下一篇: 永登县建设局网站怎么做网站赚钱的动漫网站
相关文章
-
硬件开发包网站内链优化的角度
硬件开发包网站内链优化的角度
- 技术栈
- 2026年04月20日
-
影院网站建设主管今天河南重大新闻
影院网站建设主管今天河南重大新闻
- 技术栈
- 2026年04月20日
-
影响网站速度吗重庆市建设工程信息网中标公告
影响网站速度吗重庆市建设工程信息网中标公告
- 技术栈
- 2026年04月20日
-
永登县建设局网站怎么做网站赚钱的动漫网站
永登县建设局网站怎么做网站赚钱的动漫网站
- 技术栈
- 2026年04月20日
-
永丰县城乡建设局网站百度推广需要自己做网站吗
永丰县城乡建设局网站百度推广需要自己做网站吗
- 技术栈
- 2026年04月20日
-
永济网站建设wordpress虚拟资源助推
永济网站建设wordpress虚拟资源助推
- 技术栈
- 2026年04月20日
