如何在2020年用Java安全编程

与大多数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开发人员应该意识到,确保代码安全是一个过程,而不是一个事件。 初次发布时,您可能已经使应用程序变得安全,但是其他人添加到该应用程序中的代码又如何呢? 您的用户实际使用它的方式又如何呢?

所有这些问题都需要通过在程序的整个生命周期中进行仔细的审核来解决。 您的团队需要制定严格的监控流程,以确保代码与交付之日一样安全,而不是编写,发送代码并继续进行下一个项目。 如果是您的程序导致了数据泄露,那么您的用户将花费很长时间来原谅您,因此请确保您认真地承担这一责任。

翻译自: https://jaxenter.com/java-security-2020-169083.html

# 本书共分9章,主要内容如下: # 第一章 # 解决的主要问题 # 运行本书的程序需要哪些软件? # 主要内容 # 介绍本书所使用的主要软件及其安装和配置 # 第二章 # 解决的主要问题——内容的安全性 # 数据在网上传递怎么样防止被黑客窃取听到? # 硬盘上的文件中有敏感数据,如何防止被黑客看到? # 主要内容 # 本章解决的是数据内容的安全性,介绍Java的加密和解密技术。学完该章可以通过Java编程对各种数据进行各种形式的加密。密码学也是安全机制的基础。 # 第三章 # 解决的主要问题——和源代码相关的安全性 # 编写好的程序给用户后,用户如果能反编译出源代码怎么办? # 定义类、成员变量、方法时如何防止恶意或无意的攻击? # 主要内容 # 本章解决的是和源代码相关的保护。包括源代码、类、成员变量、方法的保护。通过常用的反编译工具加强对源代码保护的认识,使用混淆器和加密等方式对源代码作了初步保护。同时演示了编写程序时如何考虑攻击者对类、成员变量、方法等方面的攻击。 # 第四章 # 解决的主要问题——确定数据的完整性和所有者 # 网上下载了一个程序,如何确定它确实是某某公司开发的? # 如何确定黑客没有将程序修改过? # 某公司或人发来一个文件,后来他不承认发过这个文件怎么办? # 主要内容 # 第四章起开始介绍和身份认证相关的技术。包括身份确定性、不可篡改性、不可否认性等,该章介绍的消息摘要和签名技术可解决这些问题。 # 第五章、第六章 # 解决的主要问题——数字化身份的凭证 # 实际应用中如何方便地使用摘要和签名技术? # 如何确定某个签名确实是某个人或机构的? # 主要内容 # 第五章和第六章介绍基于摘要和签名技术的数字证书。这是Java安全中确定身份的主要技术。其中第五章介绍了数字证书的创建、签发、验证和维护等,第六章介绍了多个证书组成的证书链(CertPath)的创建和验证。 # 第七章 # 解决的主要问题——数据安全传输,服务器和用户身份的确定 # 客户机和服务器之间的通信如何自动进行加密传输? # 客户机和服务器之间的通信如何相互确定身份? # 浏览器访问一个站点,如何确定这个站点不是黑客的服务器? # 主要内容 # 本章介绍介绍使用加密技术和证书机制的一个实际应用,基于SSL和HTTPS的编程。学完本章可以编写自己的SSL和HTTPS客户及服务器程序。 # 第八章 # 解决的主要问题——基于代码来源的程序的安全运行 # 网上下载了一个程序,运行时会不会删除我的文件,或将某些文件泄漏给黑客? # 编写了一个Java Applet,如何让其能访问硬盘上的文件? # 主要内容 # 本章介绍基于代码来源的程序的安全运行,可以基于运行时代码在哪个URL、或代码是谁签名的限制其可以访问哪些用户资源。还介绍了定义自己的权限以及签名Java Applet。 # 第九章 # 解决的主要问题——身份验证和基于执行者身份的程序的安全运行 # 程序需要用户输入账号和口令到数据库登录,但以后可能需要改为智能卡验证。 # 程序需要访问某个用户资源,但只有用户以某些特殊身份登录时才需要该权限。 # 主要内容 # 本章介绍Java验证和授权服务(JAAS),可以方便地更换验证模块,并实现基于身份的授权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值