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法则