⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247546475&idx=1&sn=ff2588d059fdd29c8a77b733aac80672&chksm=cfd30e3b02382aba7798facd3a358b042f0bb5be7285cbaa0ad7cdc2dc069b961f8efc9d53e6#rd 「null」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

离了个大谱,昨晚看到一个炸裂的新闻:Meta(前 Facebook) 由于明文存储密码,导致被爱尔兰罚款 9100 万欧元(当前约 7.11 亿元人民币)。

这一事件的起因可以追溯到 2019 年的一次安全审查。当时,Meta 被发现其旗下的 Facebook 和 Instagram 在内部系统中直接以明文形式存储了超过 6 亿个用户密码。更令人震惊的是,其中一些密码自 2012 年以来就以明文格式存在于公司服务器上,并且这些信息甚至可以被超过 2 万名 Facebook 员工随意搜索和查看。

正如我在前段时间阿里云盘出现的史诗级 Bug 时说的那样:这个世界本质上就是一个巨大的“草台班子”。无论多大的企业或多知名的技术公司,它们的运作远不如我们想象的完美。

Meta 此次事件再次证明,即便是大型企业,也难以完全避免管理上的疏漏,特别是在数据安全方面。

对于爱尔兰监管机构的高额罚款,我简直不要太赞同!用户数据的安全保护至关重要,任何疏忽都可能导致严重的安全风险。如果服务端能够直接访问用户的原始密码,那么泄露风险将大大增加,用户的隐私和安全将受到严重威胁。

服务端不应存储用户的原始密码,而是通过哈希算法生成哈希值进行保存。这种方法是不可逆的,相当于对密码进行了加密(严格来说,哈希算法不属于加密算法,但可用于某些加密场景)。

推荐的密码存储方式包括:

  1. 使用高安全性的加密哈希算法加盐(Salt):例如 SHA2、SHA3、SM3 等,这些算法具有更高的抗碰撞性和安全性。
  2. 采用慢哈希算法:如 Bcrypt,这种方式更为推荐,因为它在抵御暴力破解攻击方面表现更佳。

SHA-256 + Salt:

String password = "123456";
String salt = "1abd1c";
// 创建SHA-256摘要对象
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update((password + salt).getBytes());
// 计算哈希值
byte[] result = messageDigest.digest();
// 将哈希值转换为十六进制字符串
String hexString = new HexBinaryAdapter().marshal(result);
System.out.println("Original String: " + password);
System.out.println("SHA-256 Hash: " + hexString.toLowerCase());

输出:

Original String: 123456
SHA-256 Hash: 424026bb6e21ba5cda976caed81d15a3be7b1b2accabb79878758289df98cbec

Java 应用程序的安全框架 Spring Security 支持多种密码编码器,其中 BCryptPasswordEncoder 是官方推荐的一种,它使用 BCrypt 算法对用户的密码进行加密存储。

@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}

作为开发者和企业,必须采用正确的密码存储方法,确保用户数据的安全,保护用户隐私,避免类似的安全风险和法律责任。

文章目录