当前位置: 首页 > news >正文

分析杭州高端网站建设开发的区别wordpress企业网站插件

分析杭州高端网站建设开发的区别,wordpress企业网站插件,wordpress显示更新时间,笔记本彩页设计文章目录 Pre概述最佳实践避免使用MD5、SHA1等快速哈希算法加盐哈希 #xff08;不推荐#xff09;使用BCrypt、Argon2等慢哈希算法 (推荐)BCrypt Code1. 自动生成和嵌入盐2. 哈希结果的格式3. 代价因子 BCrypt特点 防止暴力破解1. 登录失败锁定2. 双因素认证#xff08;2FA… 文章目录 Pre概述最佳实践避免使用MD5、SHA1等快速哈希算法加盐哈希 不推荐使用BCrypt、Argon2等慢哈希算法 (推荐)BCrypt Code1. 自动生成和嵌入盐2. 哈希结果的格式3. 代价因子 BCrypt特点 防止暴力破解1. 登录失败锁定2. 双因素认证2FA3. 图形验证码或短信验证4. 异常检测与应对5. 登录通知总结 Pre MD5破解网站https://www.cmd5.com/ 计划 讨论密码保存的关键原则和最佳实践。解析不应使用MD5单独保存密码的原因。探讨加盐的必要性及注意事项。推荐使用更安全的哈希算法例如BCrypt并解释其优点。总结防止暴力破解和进一步保护用户账号的措施。 概述 在保存用户密码时最重要的原则是不要以任何形式存储原始密码而是存储经过哈希处理后的密码哈希值。传统的哈希算法如MD5虽然不可逆但由于它们的速度快且容易构建彩虹表这使得仅用它们来保存密码是不安全的。 最佳实践 避免使用MD5、SHA1等快速哈希算法 快速哈希算法如MD5、SHA1等因计算速度过快容易被利用来构建彩虹表导致密码被破解。因此不建议使用这些算法来存储用户密码。 import org.apache.commons.codec.digest.DigestUtils;GetMapping(wrong1)public UserData wrong1(RequestParam(value name, defaultValue artisan) String name, RequestParam(value password, defaultValue Abcd1234) String password) {UserData userData new UserData();userData.setId(1L);userData.setName(name);userData.setPassword(DigestUtils.md5Hex(password));return userRepository.save(userData);}String password Abcd1234; String s DigestUtils.md5Hex(password); System.out.println(s);多次 MD5 依然不安全 // 多次 MD5String s1 DigestUtils.md5Hex(DigestUtils.md5Hex(password));System.out.println(s1);加盐哈希 不推荐 加盐Salt是一种防御措施通过在密码前后加入一个随机的字符串盐值来增加哈希的复杂度。正确的加盐方法如下 每个密码都应有一个唯一的盐值。 盐值应足够长和复杂通常建议长度超过20位。 // 不能在代码中写死盐且盐需要有一定的长度 ,如下是个错误的示例String s2 DigestUtils.md5Hex(salt password);System.out.println(s2);对于这样一串 MD5虽然破解网站上找不到原始密码但是黑客可以自己注册一个账号 使用一个简单的密码比如 1 ,得到 55f312f84e7785aa1efa552acbf251db 然后再去破解网站试一下这个 MD5就可以得到原始密码是 salt也就知道了盐值是salt 盐值不应直接与用户的其他信息如用户名相关。 GetMapping(wrong3)public UserData wrong3(RequestParam(value name, defaultValue 朱晔) String name, RequestParam(value password, defaultValue Abcd1234) String password) {UserData userData new UserData();userData.setId(1L);userData.setName(name);userData.setPassword(DigestUtils.md5Hex(name password));return userRepository.save(userData);}如果世界上所有的系统都是按照这个方案来保存密码那么 root、admin 这样的用户使再复杂的密码也总有一天会被破解因为黑客们完全可以针对这些常用用户名来做彩虹表。 所以盐最好是随机的值并且是全球唯一的意味着全球不可能有现成的彩虹表给你用 盐值和哈希后的密码应一同存储盐值无需加密。 正确的做法是使用全球唯一的、和用户无关的、足够长的随机值作为盐。比如可以使用UUID 作为盐把盐一起保存到数据库中 GetMapping(right)public UserData right(RequestParam(value name, defaultValue 朱晔) String name, RequestParam(value password, defaultValue Abcd1234) String password) {UserData userData new UserData();userData.setId(1L);userData.setName(name);userData.setSalt(UUID.randomUUID().toString());userData.setPassword(DigestUtils.md5Hex(userData.getSalt() password));return userRepository.save(userData);}并且每次用户修改密码的时候都重新计算盐重新保存新的密码。在我看来 盐没有必要加密保存。盐的作用是防止通过彩虹表快速实现密码“解密”如果用户的盐都是唯一的那么生成一次彩虹表只可能拿到一个用户的密码这样黑客的动力会小很多。 使用BCrypt、Argon2等慢哈希算法 (推荐) Spring Security 已经废弃了 MessageDigestPasswordEncoder推荐使用BCryptPasswordEncoder BCrypt和Argon2是为密码保存设计的慢哈希算法。这些算法通过引入计算成本例如BCrypt的代价因子使得暴力破解变得非常困难。 BCrypt 是为保存密码设计的算法相比 MD5 要慢很多. 测试一下 MD5以及使用不同代价因子的 BCrypt看看哈希一次密码的耗时 import org.springframework.security.crypto.bcrypt.BCrypt;GetMapping(performance)public void performance() {StopWatch stopWatch new StopWatch();String password Abcd1234;stopWatch.start(MD5);DigestUtils.md5Hex(password);stopWatch.stop();stopWatch.start(BCrypt(10));String hash1 BCrypt.gensalt(10);BCrypt.hashpw(password, hash1);System.out.println(hash1);stopWatch.stop();stopWatch.start(BCrypt(12));String hash2 BCrypt.gensalt(12);BCrypt.hashpw(password, hash2);System.out.println(hash2);stopWatch.stop();stopWatch.start(BCrypt(14));String hash3 BCrypt.gensalt(14);BCrypt.hashpw(password, hash3);System.out.println(hash3);stopWatch.stop();log.info({}, stopWatch.prettyPrint());}MD5 的计算速度非常快约 0.8 毫秒这使得它容易被用于构建彩虹表或暴力破解密码。正因为它的速度快攻击者可以在短时间内生成并查找大量的 MD5 哈希值从而快速破解密码。 BCrypt 设计用于密码存储考虑了安全性。它的计算速度相对较慢特别是在设置较高代价因子cost factor的情况下。代价因子越高BCrypt 的计算时间越长这意味着攻击者需要花费更长时间才能生成彩虹表或进行暴力破解。例如 代价因子为 10 时BCrypt 哈希耗时 82 毫秒。代价因子为 12 时耗时增加到 312 毫秒。代价因子为 14 时耗时更是达到了 1.2 秒。 这意味着即使攻击者想要创建一个针对 BCrypt 的彩虹表所需的时间和计算资源也大大增加。例如若生成一个针对 8 位密码的 MD5 彩虹表需要 5 个月的时间那么对 BCrypt 而言这个时间可能会延长到几十年甚至更久。由于需要大量的计算资源和时间大部分攻击者可能会选择放弃转而寻找更容易的目标。 要估算生成一个针对 8 位密码的 MD5 彩虹表所需的时间我们需要考虑以下因素 密码空间大小8 位密码的可能组合数。MD5 哈希的计算速度每秒可以计算多少次 MD5 哈希。总计算时间生成彩虹表所需的总时间。计算密码空间大小 假设密码由 62 个字符组成大写字母、小写字母和数字共 26 26 10 62 个字符那么8位密码的可能组合数为[ 62^8 ] 计算这个值 [ 62^8 218,340,105,584,896 \text{ (约为 218 万亿次计算)} ]计算MD5哈希的速度 根据数据MD5 哈希的计算速度是 0.8 毫秒每次。那么每秒的哈希计算次数为 [ \frac{1}{0.8 \text{ 毫秒}} \frac{1}{0.0008 \text{ 秒}} 1,250 \text{ 次/秒} ]计算生成彩虹表的总时间 生成彩虹表的总时间 密码空间大小 ÷ 每秒哈希计算次数 BCrypt Code import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;private static BCryptPasswordEncoder passwordEncoder new BCryptPasswordEncoder();GetMapping(better)public UserData better(RequestParam(value name, defaultValue artisan) String name, RequestParam(value password, defaultValue Abcd1234) String password) {UserData userData new UserData();userData.setId(1L);userData.setName(name);userData.setPassword(passwordEncoder.encode(password));userRepository.save(userData);log.info(match ? {}, passwordEncoder.matches(password, userData.getPassword()));return userData;}1. 自动生成和嵌入盐 BCrypt 的 encode 方法会自动生成一个随机盐然后将这个盐与密码一起进行哈希计算。这个盐会作为哈希结果的一部分存储因此在对密码进行校验时BCrypt 可以直接从哈希结果中提取盐重新计算哈希值并进行比对。这样做的好处是你不需要手动生成和存储盐也不需要在密码校验时额外传入盐。 2. 哈希结果的格式 BCrypt 的哈希结果格式是非常标准化的结构如下 $ver$cost$saltdigest$字段分隔符。ver算法版本例如 2a 代表算法的版本。cost代价因子控制哈希计算的复杂度。值越大计算时间越长。salt生成的盐通常为 22 个字符。digest最终的哈希值也就是加盐后的密码哈希结果。 例如$2a$10$wPWdQwfQO2lMxqSIb6iCROXv7lKnQq5XdMO96iCYCj7boK9pk6QPC 可以被解析为 版本2a代价因子10盐wPWdQwfQO2lMxqSIb6iCRO哈希Xv7lKnQq5XdMO96iCYCj7boK9pk6QPC 由于盐是嵌入在哈希结果中的因此无需单独存储盐也不需要在校验时提供它。 3. 代价因子 代价因子cost factor控制了 BCrypt 哈希函数的计算复杂度。具体而言代价因子的值越高哈希计算所需的时间越长。这是 BCrypt 的一个重要特性能够有效地防止暴力破解攻击。 低代价因子计算速度快适用于对性能有要求的系统但安全性相对较低。高代价因子计算速度慢提高了攻击者进行暴力破解的成本适用于需要高安全性的场景。 实践建议 默认值通常设置为 10 是一个平衡的选择既能保证足够的安全性又不会影响用户体验。动态调整随着硬件性能的提升定期评估并增加代价因子值以应对潜在的暴力破解威胁。 BCrypt特点 内置加盐机制 BCrypt 把盐作为了算法的一部分强制我们遵循安全保存密码的最佳实践。可调节的计算成本 通过调整代价因子可以增加哈希计算的时间进一步增强密码的安全性。 BCrypt 通过引入计算时间和复杂的加盐机制使得暴力破解和彩虹表攻击变得极其困难。相比之下MD5 的速度和结构决定了它更容易被破解因此不推荐用于密码存储。选择合适的代价因子如 12 或 14能在安全性和性能之间取得平衡是保护用户密码的有效方式。 防止暴力破解 在密码存储和验证之外配套的安全防御机制对于保护用户账户至关重要。以下是几种常见的安全防御措施及其作用 1. 登录失败锁定 当用户多次输入错误的密码时暂时锁定账号可以有效防止暴力破解攻击。通常的实现方式有 逐步延迟在多次错误尝试后每次登录尝试之间引入逐步增加的延迟时间。账号锁定在一定次数的错误尝试后暂时锁定账号一段时间例如 5 分钟或要求用户通过额外验证解锁例如通过邮件或短信。 这种机制可以大大增加攻击者暴力破解的难度同时又不至于对用户造成过多的使用不便。 2. 双因素认证2FA 双因素认证要求用户在登录时除了输入密码外还需要提供另一个独立的认证信息通常是一次性验证码以进一步验证用户身份。常见的 2FA 方法包括 短信验证码用户在输入密码后会收到一条带有一次性验证码的短信用户需在登录界面输入该验证码完成认证。认证应用例如 Google Authenticator、Authy 等应用会生成基于时间的动态验证码用户需输入该验证码才能完成登录。硬件令牌如 U2F 安全密钥在登录时需要插入或接触物理设备以完成认证。 2FA 有效地增加了账户安全性因为即使密码被泄露攻击者仍需获得第二个认证因素才能登录。 3. 图形验证码或短信验证 图形验证码和短信验证可以防止自动化攻击例如暴力破解工具或脚本批量尝试登录 图形验证码在用户登录时要求用户输入图片上显示的字符。这类验证码通过生成随机图像、扭曲字符等方式阻止自动化脚本识别并输入正确的字符。短信验证在检测到异常登录行为例如来自不同地域的登录尝试时要求用户输入短信验证码以完成登录。 这种机制可以有效防止自动化攻击提高系统的安全性。 4. 异常检测与应对 现代系统还可以通过分析用户行为检测异常活动并采取措施 地理位置分析如果用户在短时间内从两个远离的地点尝试登录系统可以标记为异常行为并要求额外的验证步骤。设备识别如果用户从未使用过的设备或浏览器登录系统可以要求进行额外验证或者通知用户以防止潜在的账户劫持。 5. 登录通知 向用户发送登录通知通过邮件或短信告知他们账号的每次登录。这种做法可以让用户及时发现并报告未经授权的登录行为从而迅速采取防御措施。 总结 除了使用安全的哈希算法外配套的安全防御机制如登录失败锁定、双因素认证、图形验证码、异常行为检测等是构建健壮的用户认证系统的关键。这些机制共同作用能显著降低账户被攻击的风险保护用户数据的安全。
http://www.zqtcl.cn/news/290920/

相关文章:

  • 医疗网站建设信息cps推广平台有哪些
  • rp怎么做网站备案 添加网站
  • 汕尾手机网站设计淘宝客做网站怎么做
  • 营口公司网站建设网站百度seo关键词优化
  • 网站开发命名规范汉中网站制作
  • 嘉定网站建设公司泗水做网站ys178
  • 邯郸网站设计招聘网齐家网和土巴兔装修哪家好
  • 京东网站推广方式jquery网页设计成品
  • 做本地网站卖四川省建设科技协会网站首页
  • 注册网站引流wordpress5.0.2图集怎么发布
  • 360产品展示网站哈尔滨个人建站模板
  • 怎么做网站的浏览量陕西省住房和建设厅官方网站
  • 上海网站 备案查询平面设计接单网站有哪些
  • 用别人的公司名字做网站想自己做网站推广
  • 百度智能建站平台建设工程信息网官网入口查询
  • 比价网站源码整站程序服务器怎么发布网站
  • html插件代码大全济南网站关键词优化公司
  • 优秀的手机网站设计网站推广的特点
  • 滨州北京网站建设电子商务网站规划与管理
  • 如何注册公司网站域名中国有几大网站
  • php网站留言板怎么做wordpress 相关文章推荐
  • 怎么看网站被惩罚专业的网站建设流程
  • 如何制作手机免费网站模板下载用户体验设计师是什么
  • php网站建设基本流程基于php网站开发设计
  • 建设一个网站需要哪些软硬件条件无做弊的棋牌游戏网站
  • 最有设计感的网站扬中网站建设 优帮云
  • 企业建设银行网站登录不了wordpress需要ftp
  • 广州营销型网站建设团队专业建设内涵包括哪些内容
  • 网站如何做响应式布局外国网站上做Task
  • 知乎网站建设入门书大渡口集团网站建设