Security 如何在设计应用程序时考虑到安全性?

Security 如何在设计应用程序时考虑到安全性?,security,Security,在网上,我遇到了以下短语: 软件安全不是一个层次 在应用程序顶部,它是 从一开始就包含在您的应用程序中 但是,如何设计一个考虑到安全性的系统呢 安全由许多不同的领域组成,坦率地说是一个巨大的领域。我可以给你一些要点,但你真的需要研究。例如: 将密码存储为(盐渍)散列 清除任何外部系统的所有输入 保存并检查综合日志 执行软件更新 但正如我所说,这是一个不断变化的巨大领域。你最好的选择是拿一本关于这个主题的书。有一些软件开发过程,比如微软的安全开发生命周期(SDL),你可以在开发过程中与你的正常

在网上,我遇到了以下短语:

软件安全不是一个层次 在应用程序顶部,它是 从一开始就包含在您的应用程序中


但是,如何设计一个考虑到安全性的系统呢

安全由许多不同的领域组成,坦率地说是一个巨大的领域。我可以给你一些要点,但你真的需要研究。例如:

  • 将密码存储为(盐渍)散列
  • 清除任何外部系统的所有输入
  • 保存并检查综合日志
  • 执行软件更新

但正如我所说,这是一个不断变化的巨大领域。你最好的选择是拿一本关于这个主题的书。

有一些软件开发过程,比如微软的安全开发生命周期(SDL),你可以在开发过程中与你的正常开发方法一起使用。报价是非常正确的,您不能在完成后向应用程序添加安全性,或者当您这样做时,它将比从一开始就这样做要昂贵得多。安全过程可以帮助您确定风险所在(风险管理),并保护应用程序中包含最敏感信息的部分


然而,对于一个道德开发者(像我一样)来说,开发安全的软件是很困难的。如果安全性对您的老板或客户来说足够有价值,请雇佣一名安全工程师。他应该能够在整个过程中帮助您。

作为第一件事,也是所有安全考虑的出发点,您需要定义a:您希望发生的事情是什么,您希望防止发生的事情是什么,如果发生了,您不关心的事情是什么


然后,针对每个威胁,解释您的系统如何防止该威胁。安全专家的专业知识主要是对系统中通常发生的威胁的直觉。通过阅读文献,您可以了解到,挑战许多系统的往往是相同的威胁。

威胁模型是胡说八道,安全“专家”建议的任何东西都可能是垃圾。如果代码仅在特定情况下是安全的,那么它就不安全。正确的封装与安全性是一致的,这就是E所证明的

查看该语言,它简化了正交安全性(对象能力模型)。这是一个很好的概念证明,还有其他类似的语言,比如Joe-E,它与Java的范例相同,Emily代表Ocaml,Oz-E代表Oz。不幸的是,E是动态类型的,但幸运的是,它的实现方式比我见过的其他动态类型语言要聪明得多。即使你最终没有在任何事情上使用E,它仍然会教你如何通过声音设计实现安全性

这实际上是应该如何做到安全的;当我想到一台计算机时,我想到一台用来运行算法和软件的设备。我从来没有想过flash游戏能够破坏我的整个系统,窃取我的所有数据。但几天前,我在实验室电脑上安装了最新的Windows7,一天后用完全更新的Firefox/Flash浏览互联网后,它就被破坏了。这不是计算机应该如何工作的,你不必担心阅读某段文字会使你的银行账户被盗。但不幸的是,每一个事实上的O/S都在这方面存在根本性的缺陷,而且将永远存在,因为它们是用不安全的语言编写的

总之,有助于安全的一些基本因素:

  • 没有全局可变状态,永远没有理由
  • 上面的排序:不要写入文件系统中的随机硬编码路径,这将导致冲突、更多错误和漏洞。理想情况下,您应该只获得操作系统传递给您的程序的某个持久存储的句柄,您可以对其进行读/写,这样就不可能发生冲突,Java的Java.util.prefs.Preferences正是这样做的
  • 尽可能多地处理强类型数据。不要使用鼓励解析文本的玩具语言,也不要使用弱类型的语言,例如bash、Perl、PHP、JavaScript、tcl、C/C++、Python*等。每次手动转义HTML、转义bash命令输入、转义SQL输入时,都是在自找麻烦。说到HTML,尽可能避免将应用程序用于web,因为web不是为了安全而设计的
  • 不,那太愚蠢了
  • 正确封装,这在任何正交安全语言中都是至关重要的,您不能使用getSocket()函数在系统中创建文件并将~/home/lol重命名为~/home/wtf,遵循Demeter法则
基本上,只要遵循好的实践(在现实世界中并不多见),你就会安全。合理的设计=安全性=速度=可用性(但不要小题大做)。封装是关键,E强制您进行适当的封装

*C/C++是禁止的。时期即使是世界上最好的数学家也无法编写没有重大漏洞的大规模C/C++程序。我所知道的最好的例子是一个大约4000K行的微内核,它最终有250K行的证明。我从未见过一个大型的C++游戏,没有主要的漏洞。 **Python是强类型的,但它仍然容易出错,因为它鼓励执行诸如monkey修补、继承之类的操作(但无法防止私有成员名称冲突,这一直是个问题)。作用域是虚拟的,所以当您访问任何局部变量时,它会在dict中查找它。它有eval/exec。每个人都只是pickle,这会导致任意代码执行(即,您永远不能使用其他人的Python程序数据,因为它可能有一个pickle,当您从中读取时,它将拥有您)。它的速度非常慢,可能总是会与静态类型语言相比较。

s