96SEO 2026-02-20 02:23 0
讨论密码保存的关键原则和最佳实践。

解析不应使用MD5单独保存密码的原因。
探讨加盐的必要性及注意事项。
推荐使用更安全的哈希算法例如BCrypt并解释其优点。
总结防止暴力破解和进一步保护用户账号的措施。
在保存用户密码时最重要的原则是不要以任何形式存储原始密码而是存储经过哈希处理后的密码哈希值。
传统的哈希算法如MD5虽然不可逆但由于它们的速度快且容易构建彩虹表这使得仅用它们来保存密码是不安全的。
快速哈希算法如MD5、SHA1等因计算速度过快容易被利用来构建彩虹表导致密码被破解。
因此不建议使用这些算法来存储用户密码。
org.apache.commons.codec.digest.DigestUtils;GetMapping(wrong1)public
UserData();userData.setId(1L);userData.setName(name);userData.setPassword(DigestUtils.md5Hex(password));return
userRepository.save(userData);}String
DigestUtils.md5Hex(DigestUtils.md5Hex(password));System.out.println(s1);加盐哈希
加盐Salt是一种防御措施通过在密码前后加入一个随机的字符串盐值来增加哈希的复杂度。
正确的加盐方法如下
password);System.out.println(s2);对于这样一串
MD5虽然破解网站上找不到原始密码但是黑客可以自己注册一个账号
55f312f84e7785aa1efa552acbf251db
UserData();userData.setId(1L);userData.setName(name);userData.setPassword(DigestUtils.md5Hex(name
userRepository.save(userData);}如果世界上所有的系统都是按照这个方案来保存密码那么
这样的用户使再复杂的密码也总有一天会被破解因为黑客们完全可以针对这些常用用户名来做彩虹表。
所以盐最好是随机的值并且是全球唯一的意味着全球不可能有现成的彩虹表给你用
正确的做法是使用全球唯一的、和用户无关的、足够长的随机值作为盐。
比如可以使用UUID
UserData();userData.setId(1L);userData.setName(name);userData.setSalt(UUID.randomUUID().toString());userData.setPassword(DigestUtils.md5Hex(userData.getSalt()
userRepository.save(userData);}并且每次用户修改密码的时候都重新计算盐重新保存新的密码。
在我看来
盐没有必要加密保存。
盐的作用是防止通过彩虹表快速实现密码“解密”如果用户的盐都是唯一的那么生成一次彩虹表只可能拿到一个用户的密码这样黑客的动力会小很多。
MessageDigestPasswordEncoder推荐使用BCryptPasswordEncoder
BCrypt和Argon2是为密码保存设计的慢哈希算法。
这些算法通过引入计算成本例如BCrypt的代价因子使得暴力破解变得非常困难。
org.springframework.security.crypto.bcrypt.BCrypt;GetMapping(performance)public
Abcd1234;stopWatch.start(MD5);DigestUtils.md5Hex(password);stopWatch.stop();stopWatch.start(BCrypt(10));String
BCrypt.gensalt(10);BCrypt.hashpw(password,
hash1);System.out.println(hash1);stopWatch.stop();stopWatch.start(BCrypt(12));String
BCrypt.gensalt(12);BCrypt.hashpw(password,
hash2);System.out.println(hash2);stopWatch.stop();stopWatch.start(BCrypt(14));String
BCrypt.gensalt(14);BCrypt.hashpw(password,
hash3);System.out.println(hash3);stopWatch.stop();log.info({},
毫秒这使得它容易被用于构建彩虹表或暴力破解密码。
正因为它的速度快攻击者可以在短时间内生成并查找大量的
设计用于密码存储考虑了安全性。
它的计算速度相对较慢特别是在设置较高代价因子cost
的计算时间越长这意味着攻击者需要花费更长时间才能生成彩虹表或进行暴力破解。
例如
而言这个时间可能会延长到几十年甚至更久。
由于需要大量的计算资源和时间大部分攻击者可能会选择放弃转而寻找更容易的目标。
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;private
BCryptPasswordEncoder();GetMapping(better)public
UserData();userData.setId(1L);userData.setName(name);userData.setPassword(passwordEncoder.encode(password));userRepository.save(userData);log.info(match
passwordEncoder.matches(password,
userData.getPassword()));return
方法会自动生成一个随机盐然后将这个盐与密码一起进行哈希计算。
这个盐会作为哈希结果的一部分存储因此在对密码进行校验时BCrypt
可以直接从哈希结果中提取盐重新计算哈希值并进行比对。
这样做的好处是你不需要手动生成和存储盐也不需要在密码校验时额外传入盐。
$ver$cost$saltdigest$字段分隔符。
ver算法版本例如
代表算法的版本。
cost代价因子控制哈希计算的复杂度。
值越大计算时间越长。
salt生成的盐通常为
例如$2a$10$wPWdQwfQO2lMxqSIb6iCROXv7lKnQq5XdMO96iCYCj7boK9pk6QPC
版本2a代价因子10盐wPWdQwfQO2lMxqSIb6iCRO哈希Xv7lKnQq5XdMO96iCYCj7boK9pk6QPC
由于盐是嵌入在哈希结果中的因此无需单独存储盐也不需要在校验时提供它。
哈希函数的计算复杂度。
具体而言代价因子的值越高哈希计算所需的时间越长。
这是
低代价因子计算速度快适用于对性能有要求的系统但安全性相对较低。
高代价因子计算速度慢提高了攻击者进行暴力破解的成本适用于需要高安全性的场景。
是一个平衡的选择既能保证足够的安全性又不会影响用户体验。
动态调整随着硬件性能的提升定期评估并增加代价因子值以应对潜在的暴力破解威胁。
把盐作为了算法的一部分强制我们遵循安全保存密码的最佳实践。
可调节的计算成本
通过调整代价因子可以增加哈希计算的时间进一步增强密码的安全性。
通过引入计算时间和复杂的加盐机制使得暴力破解和彩虹表攻击变得极其困难。
相比之下MD5
的速度和结构决定了它更容易被破解因此不推荐用于密码存储。
选择合适的代价因子如
在密码存储和验证之外配套的安全防御机制对于保护用户账户至关重要。
以下是几种常见的安全防御措施及其作用
当用户多次输入错误的密码时暂时锁定账号可以有效防止暴力破解攻击。
通常的实现方式有
逐步延迟在多次错误尝试后每次登录尝试之间引入逐步增加的延迟时间。
账号锁定在一定次数的错误尝试后暂时锁定账号一段时间例如
这种机制可以大大增加攻击者暴力破解的难度同时又不至于对用户造成过多的使用不便。
双因素认证要求用户在登录时除了输入密码外还需要提供另一个独立的认证信息通常是一次性验证码以进一步验证用户身份。
常见的
短信验证码用户在输入密码后会收到一条带有一次性验证码的短信用户需在登录界面输入该验证码完成认证。
认证应用例如
等应用会生成基于时间的动态验证码用户需输入该验证码才能完成登录。
硬件令牌如
有效地增加了账户安全性因为即使密码被泄露攻击者仍需获得第二个认证因素才能登录。
图形验证码和短信验证可以防止自动化攻击例如暴力破解工具或脚本批量尝试登录
图形验证码在用户登录时要求用户输入图片上显示的字符。
这类验证码通过生成随机图像、扭曲字符等方式阻止自动化脚本识别并输入正确的字符。
短信验证在检测到异常登录行为例如来自不同地域的登录尝试时要求用户输入短信验证码以完成登录。
地理位置分析如果用户在短时间内从两个远离的地点尝试登录系统可以标记为异常行为并要求额外的验证步骤。
设备识别如果用户从未使用过的设备或浏览器登录系统可以要求进行额外验证或者通知用户以防止潜在的账户劫持。
向用户发送登录通知通过邮件或短信告知他们账号的每次登录。
这种做法可以让用户及时发现并报告未经授权的登录行为从而迅速采取防御措施。
除了使用安全的哈希算法外配套的安全防御机制如登录失败锁定、双因素认证、图形验证码、异常行为检测等是构建健壮的用户认证系统的关键。
这些机制共同作用能显著降低账户被攻击的风险保护用户数据的安全。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback