代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6350 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

42 | 纵深,代码安全的深度防御

范学雷 2019-04-10
前面我们聊了保持代码长治久安的两个策略,代码规范和风险预案。这一次,我们接着聊代码安全管理的另外一个策略:纵深防御。
说起纵深防御(Defence-in-Depth),我们最常想到的是军事战略。在军事上,这个概念指的是通过层层设防,以全面深入的防御来延迟敌人的进攻,通过以空间换时间的方式来挫败敌方的攻击。这有别于一战定胜负的决斗思维。决斗思维需要集中所有的优势资源在最前线,一旦前线失守,整个战争基本就宣告结束了。
信息安全的攻防,有一个很重要的特点,就是不存在没有漏洞的防线。按照决斗思维部署的信息安全防御体系,也许仅仅只能是个心理安慰。事实上,现代网络安全防御体系和应用架构,不管你是否意识到,已经在广泛使用纵深防御的思想了,或多或少,或明或暗。

评审案例

我们一起来看一段 OpenJDK 的代码修改。其中 wrap() 方法的传入参数 key 是一个不能泄露的密钥,而 key.getEncoded() 导出这个密钥的编码,以便进行下一步的加密操作。有时候,密钥的编码可以等同于密钥,也是不能泄露的。你知道这样修改的必要性吗?
byte[] wrap(Key key)
throws IllegalBlockSizeException, InvalidKeyException {
byte[] result = null;
+ byte[] encodedKey = null;
try {
- byte[] encodedKey = key.getEncoded();
+ encodedKey = key.getEncoded();
if ((encodedKey == null) || (encodedKey.length == 0)) {
throw new InvalidKeyException(
"Cannot get an encoding of " +
"the key to be wrapped");
}
result = doFinal(encodedKey, 0, encodedKey.length);
} catch (BadPaddingException e) {
// Should never happen
+ } finally {
+ if (encodedKey != null) {
+ Arrays.fill(encodedKey, (byte)0x00);
+ }
}
return result;
}
这个代码变更,是对临时私密缓冲区的更积极的管理。

案例分析

我们知道,如果一段存储空间不再使用,一般而言,操作系统或者应用程序仅仅是“忘记”或者“删除”这段存储空间的索引,并不清理存储空间里的具体内容。我们常说“释放”一段内存空间。我觉得“释放”这个词使用很贴切。释放后,那段内存空间还在,模样也没有变化,内容也没有什么变化,只是被释放了,被丢弃了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • 天佑
    核电站通用设计准则,访问不了,显示不允许访问。。

    作者回复: 😯

    2019-04-10
    1
  • 松花皮蛋me
    老师我觉得专栏的安全方面内容太多,但是技巧类的太少了

    作者回复: 😄,技巧类的太多了,而且我懂得极少,所以写的也少。

    2019-04-10
    1
  • wind
    纵深防御指南的链接点过去是page not found

    作者回复: 新的链接: https://www.oracle.com/database/technologies/security.html

    还有一个中文版:
    https://www.oracle.com/technetwork/topics/security/sol-home-084333-zhs.html

    2019-09-29
  • hua168
    我们怎么防止还是会有想不到位的地方,那么我们可不可以做一点监控或者一些策略。
    1.做监控是为了方便跟踪,知道对方是怎么进来的
    2.做策略是补防守不周全的情况,比如前面再加多一层安全过滤层,做一些行为判断
      比如定义一些异常访问,如包括一些特殊字符,异常行为

    但这些会加大工作量吧,是不是等公司壮大的时候再重做?

    作者回复: 有些公司的商业模式安全很重要,早做的好。

    工作量这个标尺,太耽误事!没有工作的工作量最小。做最简单的事情,把简单的事情做好。别做大量的事情,把事情做的闹心。不需要现在就做的事情不去做,我们就有时间把少量的事情做好了。

    2019-04-10
收起评论
4
返回
顶部