与大多数Java开发人员交谈,他们会告诉您Java是目前最安全的编程语言。 但是,当然,他们会这么说。
事实是,尽管Java在安全性方面比旧的语言(尤其是C和C ++)取得了长足的进步,但用Java编写的代码的漏洞级别取决于程序员遵循的最佳实践。
在当今的开发环境中尤其如此。 各种新的安全技术,黑客技术以及新颖的存储和加密形式,意味着许多人在质疑Java安全性方面的旧确定性。 Java开发人员面临的新挑战包括云迁移的安全性问题 。 另一方面,新的安全审核技术(如混沌工程)为开发人员提供了许多提高代码安全性的机会。
在本文中,我们将研究2020年使用Java进行编码时应遵循的五项原则。理想情况下,这些原则应集成到DevSecOps流程中,在此流程中安全性是从头开始构建的,但是它们对于审核遗留代码同样有用。
还请参见: JEP 372:删除Nashorn JavaScript引擎
1.审核您的图书馆
让我们从基于Java的软件最明显的漏洞源开始:外部库。 对于绝大多数项目,无论是用Java还是任何其他语言编写的,库都会损害大多数代码 。 不幸的是,许多开发团队无法提供他们使用的第三方库的列表。
当然,使用外部库本身不是问题。 确实,在2020年,大多数开发人员的大部分时间都花在了与第三方库的合作上。 随着客户需求的发展,最初只是一个简单的会计软件,将添加一些库来实现加价计算器 ,纳税申报单生成器和ROI统计信息包。 每次添加新库时,重要的是使开发人员仔细检查这些库中的已知漏洞。
审计您的库不仅对安全性有好处。 在审核的同时,您可能还会发现其他对性能产生不利影响的问题。 而且,如果您要审核的库是开源的,则可以借此机会报告错误并在整个开源社区中建立团队的声誉。
2.管理应用程序秘密
在管理应用程序机密时,Java开发人员也养成了一些坏习惯。 实际上,社区可以分为两个阵营:那些牺牲安全性以便为用户提供尽可能流畅的软件体验的人,以及那些希望用户花费4个小时来输入自己的凭据的人。
实际上,2020年的编码意味着在安全性和可用性之间取得平衡。 对可用性的过多关注通常会导致代码不安全。 对安全性的过多关注意味着您的用户将花费大部分时间来尝试解决已采取的安全措施。 而且,正如任何经验丰富的开发人员所知道的那样,用户最终将找到解决您所采用的每种安全措施的方法。
在管理应用程序机密时,Java开发人员可以从了解CMS平台之间的差异中学到很多东西。 这可能会令某些人感到震惊,但请听我们说。 大多数CMS平台具有庞大的用户基础,这意味着其开发人员必须仔细考虑如何管理应用程序机密,同时还要保持普通用户的可用性。
这些平台中的许多平台都使用了像AWS KMS这样的高质量密钥管理服务,该服务可确保其存储的代码秘密不再存在于内存中。 尽管许多“认真”的Java开发人员都否定了这样的方法,但将它们添加到许多Java软件中还是值得欢迎的。
3.使用成熟的加密库
一种特定类型的库应比其他类型的库进行审计和分析的频率更高:用于加密的库。 过去,用于加密的Java库极难使用,其API对普通开发人员的帮助不足。
不幸的是,这导致许多Java开发人员将事情交给了自己,并编写了自己的加密库。 实际上,社区中的许多人为自己的自制加密技术感到自豪,并对使用他人编写的代码表示怀疑。 这是一个巨大的错误 。 有些开发人员一生都在制作不可破解的加密库,并信任我们:他们的性能比您的强。
在Java中进行加密的最佳方法是使用该语言提供的内置工具。 重新发明轮子没有任何意义(也存在重大弊端)(请参阅下文)。 基本Java附带的库已被证明是安全的,而您的库则没有。
4.验证您的输入
如上所述,2020年的编程工作很大一部分就是确保您的用户不会破坏您精心设计的软件。 最简单的方法之一是花费一些时间来验证用户输入。 如果做得正确,采取谨慎的方法将有两个巨大的好处。 它不仅使您的应用程序更安全,而且使它们更易于使用。
在2020年,我们还应该记住,“用户输入”不仅来自人类。 Mirai僵尸网络已经说明了开发人员无法正确验证来自IoT设备的输入的危险,并且在未来十年中,这将变得更加关键。
像清单中的许多原理一样,在涉及用户验证时,开发人员可以简单地使用Java本身附带的工具。 扫描程序库提供了验证的基本实现,可以限制用户输入并着眼于安全性。 使用这种验证工具意味着您不必编写复杂的自定义验证逻辑。 如果您不想,那就是。
5.不要重新发明轮子
最后,一个万能的原则适用于所有语言的所有开发人员。 不要自己制作易于使用的版本。
鉴于在广泛使用的库中经常发现有关漏洞的头条新闻,因此,开发人员认为他们最好自己制作一个库。 如果没有其他人编辑该库,按照逻辑进行,那么没有其他人将能够在其中找到漏洞。 问题在于, 晦涩的代码并没有比公开代码固有地更安全 。 实际上,主要区别在于,成千上万的人在检查开源库,漏洞很快被发现。 更好的恶魔,以及所有。
该原则几乎适用于您作为Java开发人员所做的所有事情。 我们已经看到一些实例,其中开发人员花费数月的时间制定自己的加密协议(请参阅第2点),以在网络上发送应用程序数据。 可能很有趣,但是这里有个主意:只需使用VPN服务即可 。 安装将花费几秒钟,您可以继续进行更重要的事情。
还请参见: Java趋势:2020年十大框架
100%安全
不幸的是,完美的安全是不可能的。 有时您总是会弄乱并编写不安全的代码,很容易养成使用不安全的库的习惯。
确保Java开发中的安全性的关键是拥有一个用于检查安全漏洞并将其关闭的系统。 鉴于Java在2020年的发展方式 ,开发人员扫视地平线以发现新的安全威胁,并准备对其做出响应,这一点比以往任何时候都更为重要。 关于网络安全行业是否能跟上5G的发展已经存在严重的问题,而物联网提出了另一个挑战。
最重要的是,Java开发人员应该意识到,确保代码安全是一个过程,而不是一个事件。 初次发布时,您可能已经使应用程序变得安全,但是其他人添加到该应用程序中的代码又如何呢? 您的用户实际使用它的方式又如何呢?
所有这些问题都需要通过在程序的整个生命周期中进行仔细的审核来解决。 您的团队需要制定严格的监控流程,以确保代码与交付之日一样安全,而不是编写,发送代码并继续进行下一个项目。 如果是您的程序导致了数据泄露,那么您的用户将花费很长时间来原谅您,因此请确保您认真地承担这一责任。