某大厂被曝明文存储密码!

科技   2024-09-29 12:43   湖北  

离了个大谱,昨晚看到一个炸裂的新闻: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();
}

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

📌Java 后端技术面试准备强烈推荐《Java 面试指北》 和 JavaGuide ,400 多人参与维护完善,质量非常高。另外,目前的面试趋势是场景题变多,可以参考《后端面试高频系统设计&场景题》(20+高频系统设计&场景面试题)进行准备!

⭐️推荐阅读:


专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入我的知识星球 ,和 3w+球友一起准备面试!

JavaGuide
JavaGuide(javaguide.cn)官方公众号,专注分享原创Java技术干货。
 最新文章