读程序员的制胜技笔记14_安全审查(下)

这篇具有很好参考价值的文章主要介绍了读程序员的制胜技笔记14_安全审查(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读程序员的制胜技笔记14_安全审查(下)文章来源地址https://www.toymoban.com/news/detail-746382.html

1. 拒绝服务

1.1. denial of service,DoS

1.1.1. 一系列让你没法正常提供网络服务的攻击手段的通用名称

1.2. 一个较为通用的方法就是使用验证码

1.2.1. 验证码简直是万维网祸根

1.2.2. 验证码的确有它的作用,但是弊大于利,它算另一种形式的DoS

1.2.2.1. 看不出来是什么?那我拒绝为你服务

1.3. 验证码的代替品

1.3.1. 编写高性能的代码,积极进行缓存,并在必要时使用节流

1.4. 代替节流的办法

1.4.1. 工作量证明(proof of work)

1.4.1.1. 工作量证明相当消耗客户端的运算资源,对那些性能较低的设备不友好,并且它还会影响设备电池的使用寿命

1.4.1.2. 有可能会严重降低用户体验,其后果甚至比验证码的还要恶劣

2. 缓存

2.1. 字典可能是网络框架中最常用的数据结构

2.1.1. HTTP请求和响应头、cookie和缓存条目都被保存在字典当中

2.1.2. 典的运算速度快得惊人,因为它们的复杂度为O(1)

2.1.3. 查询得到结果基本是瞬时的

2.2. 字典的隐患

2.2.1. 我们可能直接启用字典当作保存某个东西的缓存

2.2.2. 在.NET中甚至有ConcurrentDictionary,它是线程安全(thread-safe)的,使得它有作为手动缓存的潜力

2.2.3. 哈希碰撞攻击(hash collision attack)

2.2.4. 字典没有默认的限制机制,它们会无限制地增长

2.3. 为面向网络的组件开发的自定义字典,如SipHash,通常使用一种不同的哈希算法,它具有更好的分布特性,因此碰撞概率更小

2.3.1. 算法的平均运算速度可能比常规哈希算法略慢,但由于它们能抵抗哈希碰撞攻击,因此在最坏的情况下表现得更好

2.4. 请考虑利用现有的缓存基础设施,最好是框架提供的缓存

3. 存储机密信息

3.1. 机密信息(密码、私钥和API令牌)是通向你“领地”的钥匙

3.2. 分区是缓解安全威胁最好的措施之一

3.3. 理想的方法是将机密信息存储在专门为该目的而设计的独立存储中

3.4. 从长远来看,所有的源代码都被托管在GitHub上

3.5. 别收集你不需要的数据

3.5.1. 如果数据一开始就不存在,那么它就不会被泄露

3.5.2. 除了你的服务必须的数据之外,绝不收集其他数据

3.5.2.1. 存储需求更少,性能更强,数据管理工作更少,用户体验更好

3.6. 正确的密码哈希算法

3.6.1. 防止密码被泄露的最常见方法是使用哈希算法

3.6.2. 你存储的不再是密码本身,而是密码的加密安全哈希值

3.6.3. 对于进行密码哈希,首选的方法是只使用一种加密算法,将这一种算法进行多次迭代,来降低执行速度

3.6.4. 永远不要使用单次迭代的哈希算法

3.6.4.1. 即使它们在密码学上是安全的,如SHA2、SHA3

3.6.5. 永远不要使用MD5或SHA1

3.6.5.1. 因为它们早已被破解

3.6.6. 密码学上的安全属性只能确保算法具有特别低的碰撞概率,并不能确保它们能抵抗暴力攻击

3.6.6.1. 所有现代的抗暴力哈希算法要么以难度系数(difficulty coefficient)为参数,要么以迭代次数(number of iteration)为参数

3.6.7. 一个常见的专门用来减缓工作速度的哈希函数为PBKDF2

3.6.7.1. “password- based key derivation function two”(基于密码的密钥导出函数二)的缩写

3.6.8. 一些较新的哈希算法,如bcrypt、scrypt和Argon2,也能抵抗基于GPU或ASIC的攻击

3.6.9. 建议对你的密码哈希难度进行基准测试

3.6.9.1. 确保它不会在以后为难你,因为一旦方案开展,再去改变哈希算法是很困难的

3.6.10. 建议优先选择你使用的框架所支持的算法

3.6.10.1. 你应该选择经过最多测试的一种

3.6.10.2. 新的算法通常不会有像老的算法那样多的测试和验证次数

3.7. 安全地比较字符串

3.7.1. 不提前返回,而是保留结果,即使比较失败也继续进行比较

3.7.2. 我们所有的比较都需要一个恒定的时间,避免泄露用户的哈希值

3.8. 不要使用固定的“盐”

3.8.1. “盐”,是引入密码哈希算法中的附加值,使得加密值产生偏离

3.8.2. 它旨在解决相同哈希值这一问题

3.8.3. 你不希望攻击者只通过猜测一个密码的哈希值就能破解所有相同的密码

3.8.3.1. 即便用户的所有密码都是hunter2,但所有密码都会有不同的哈希值,增加了攻击者的破解难度

3.8.4. 你应该始终使用随机值作为盐,但不是普通的伪随机值,而是由CSPRNG(密码学上安全的伪随机值生成器)生成的值

3.8.5. 常规随机值是用简单和可预测的算法生成的

3.8.6. 它们的目标并不是创造真正的随机值,而仅仅是模仿生成随机值,让人觉得是随机值

3.9. UUID并不是随机的

3.9.1. 通用唯一标识符(universally unique identifie,UUID)或者全局唯一标识符(globally unique identifier,GUID),在微软世界里,被称为随机数字(random-looking number)

3.9.2. 虽然被设计为唯一的,可不一定是安全的

3.9.2.1. 因为不能保证它们是用加密安全的伪随机值生成器(CSPRNG)创建的

3.9.3. 始终使用CSPRNG来生成安全敏感的令牌

3.9.4. UUID可能不是完全随机的,但它们作为标识符肯定比简单地逐一递增的整数更安全

3.9.5. 新的UUID标准,即UUID v6、UUID v7和UUID v8仍然有随机性,但它们包含时间戳,能创造更均匀的索引散布

4. 如果一条捷径阻碍了你的进步,那么它就不是真正的捷径

到了这里,关于读程序员的制胜技笔记14_安全审查(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读程序员的制胜技笔记06_测试(下)

    1.3.1.1. 假设18岁是你游戏用户的法定年龄 1.3.2.1. C# 1.3.2.1.1. 不需要测试公元1年1月1日到9999年12月31日之间所有可能的DateTime值(有360多万个) 1.3.2.1.2. 只需要测试7个不同的输入 1.3.2.1.3. 通过条件语句将输入范围进行分割的操作称为“边界条件”(boundary conditional) 1.3.2.1.3.1. 定

    2024年02月05日
    浏览(48)
  • 读程序员的制胜技笔记10_可口的扩展

    2.8.3.1. 纯函数有一个好处,它们是100%线程安全的 2.9.1.1. 这套数据结构并不都是无锁的 2.9.1.2. 虽然它们依然使用锁,但它们是被优化过的,锁的持续时间会很短,保证了其速度,而且它们可能比真正的无锁替代方案更简单 2.9.2.1. 其中原始数据从未改变,但每个修改操作都

    2024年02月05日
    浏览(68)
  • 读程序员的制胜技笔记09_死磕优化(下)

    7.5.3.1. 在256KB之后,提升突然变得杯水车薪

    2024年02月05日
    浏览(74)
  • 读程序员的制胜技笔记08_死磕优化(上)

    4.3.1.1. 只能给你一堆用于比较的数字 4.3.1.2. 不能告诉你代码的运行速度是快还是慢 4.3.1.3. 可以告诉你它们比其他一些代码运行得慢还是快 4.3.5.1. 可以消除因测量误差或者调用开销产生的波动 4.3.5.2. 适用于微观基准测试 4.3.5.2.1. 适用于微观基准测试 4.3.5.3. 基准测试并没

    2024年02月05日
    浏览(81)
  • 读程序员的制胜技笔记02_算法与数据结构

    3.1.1.1. 根据你的需要,可以有更智能的算法 3.1.3.1. 算法本身并不意味着它很聪明 3.2.1.1. public static bool Contains(int[] array, int lookFor) { for (int n = 0; n < array.Length; n++) {        if (array[n] == lookFor) {            return true;        }    }    return false; } 3.3.1.1. public sta

    2024年02月06日
    浏览(62)
  • 读程序员的制胜技笔记12_与Bug共存(下)

    2.2.1.1. 故障代码(failing code)放在一个try语句块里,然后加上一个空的catch语句块,就大功告成了 2.2.1.2. 开发者为整个应用程序添加了一个通用的异常处理程序,但实际上这个程序的工作原理就是忽略所有的异常,也就防止所有的崩溃 2.2.1.3. 如果像那样添加一个空的处理程序

    2024年02月05日
    浏览(59)
  • 读程序员的制胜技笔记11_与Bug共存(上)

    2.7.3.1. 在构造时验证其有效性,这样一来就不可能包含无效值 2.8.2.1. 其主张一个花括号与声明在同一行 2.9.1.1. 看看这些现成的类型 2.9.3.1. 它代表持续时间 2.9.3.2. 你没有理由用TimeSpan以外的任何东西来表示持续时间,即使你所调用的函数不接受TimeSpan作为参数 2.9.4.1. 它也

    2024年02月05日
    浏览(56)
  • 读程序员的制胜技笔记04_有用的反模式(下)

    1.3.1.1. 自己做自己的甲方 3.2.2.1. 紧耦合(tight coupling) 3.2.2.2. 依赖性是万恶之源 3.3.7.1. 因为你可能需要用接口而不是具体的引用来定义依赖关系,但这也会使代码摆脱依赖关系 5.2.3.1. 没有其他错误发生时执行的代码部分 5.3.3.1. 退出点(exit point)是指函数中导致其返回给调用

    2024年02月06日
    浏览(86)
  • 读程序员的制胜技笔记03_有用的反模式(上)

    4.5.4.1. 你在物理数据库结构上增加了一个依赖项 4.5.4.2. 如果你需要改变信息表的布局或所使用的数据库技术,你就必须检查所有的代码,确保所有的东西都能与新的表布局或新的数据库技术一起工作 4.5.6.1. 这是保持组件或整个层尽可能简单的关键 4.8.3.1. 每个成员只对自己

    2024年02月06日
    浏览(47)
  • 读程序员的README笔记14_技术设计流程(下)

    1.4.2.1. 该项目将需要至少一个月的工程时间 1.4.2.2. 变更将对软件的扩展和维护产生长期的影响 1.4.2.3. 变更将显著影响其他团队 1.5.2.1. 设计文档是一种工具,可以帮助你思考、获得反馈、让你的团队了解情况、培养新的工程师,并推动项目规划 1.5.5.1. 阅读大量的设计文档

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包