数据安全存储与密码保护指南
1. 字典存储的问题
字典是一种实用的数据结构,在 .NET 中甚至有线程安全的 ConcurrentDictionary ,这使得它成为手动实现缓存的一个有吸引力的选择。然而,框架中包含的常规字典通常不是为基于用户输入的键而设计的。如果攻击者知道你使用的运行时,他们可以发起哈希碰撞攻击。他们可以发送许多不同的键,但这些键对应相同的哈希码,从而导致碰撞。这会使查找操作的时间复杂度从 O(1) 接近 O(N),严重影响应用程序的性能。
为面向 Web 的组件开发的自定义字典,如 SipHash,通常使用具有更好分布特性的不同哈希码算法,因此碰撞概率更低。这些算法平均而言可能比常规哈希函数稍慢,但由于它们对碰撞攻击的抗性,在最坏情况下表现更好。
此外,字典默认没有淘汰机制,会无限增长。在本地测试时可能看起来没问题,但在生产环境中可能会导致严重问题。理想情况下,缓存数据结构应该能够淘汰旧条目以控制内存使用。
2. 秘密存储的重要性
秘密(如密码、私钥和 API 令牌)是访问系统的关键。尽管它们只是小数据片段,但能提供不成比例的访问权限。例如,拥有生产数据库的密码就可以访问所有数据;拥有 API 令牌就可以执行该 API 允许的任何操作。因此,秘密必须成为威胁模型的一部分。
2.1 避免将秘密存储在源代码中
程序员倾向于走捷径,将密码放在源代码中是常见的做法。但从长远来看,所有源代码都会被托管在 GitHub 等平台上。源代码的敏感性不如生产数据库,但却包含访问数据库的密钥。客户可能出于合同目的请求源代码,开发人员可能保留本地副本,而他们的计算
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



