安全顶部

我刚宣布了新的学习春天安全课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>查看课程
Java最高

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>查看课程

1.概述

在本教程中,我们将介绍Java平台上安全性的基础知识。我们还将关注编写安全应用程序时可用的内容。

安全是包含许多领域的巨大主题。其中一些是语言本身的一部分,如访问修饰符和类加载器。此外,其他人可用作服务,包括数据加密,安全通信,身份验证和授权,以少数名。

因此,在本教程中获得有意义的洞察力并不实用。但是,我们将尝试至少获得有意义的词汇。

2.语言特性

最重要的是,Java中的安全性在语言功能级别开始。这允许我们编写安全代码,并从许多隐式安全特性中获益:

  • 静态数据键入:Java是一种静态类型的语言,哪个减少运行时检测类型相关错误的可能性
  • 访问修改器:Java允许我们使用不同的访问修饰符,如公共和私人,以控制对字段,方法和类的访问
  • 自动内存管理:Java有基于垃圾收集的内存管理,将开发人员从手动管理中解放出来
  • 字节码验证:Java是一种编译语言,这意味着它将代码转换为与平台无关的字节码运行时验证每个字节码它加载执行

这并不是Java提供的安全特性的完整列表,但已经足够给我们一些保证了!

3. Java中的安全架构

在我们开始探索特定领域之前,让我们花一些时间来理解Java中安全性的核心体系结构。

Java中的安全核心原则是驱动的可互操作和可扩展的提供者实现。的特定实现提供者可以实现某些或全部安全服务。

例如,一些典型的服务a提供者可以实施是:

  • 密码算法(如DSA、RSA、SHA-256)
  • 关键一代,转换和管理设施(例如特定算法键)

Java附带很多内置的提供者。此外,应用程序可以以优先顺序配置多个提供程序。

因此,提供者框架Java在所有提供者中按照首选顺序搜索服务的特定实现设置在他们身上。

此外,始终可以在此体系结构中实现具有可插拔安全功能的自定义提供程序。

4.加密

加密是一般和Java的安全功能的基石。这是指的用于在敌人面前进行安全通信的工具和技术

4.1。Java加密

Java密码架构(JCA)提供了一个框架来访问和实现Java中的加密功能,包括:

最重要的是,Java利用提供者的实现用于加密功能。

此外,Java还包含内置的提供程序,用于诸如RSA、DSA和AES等常用加密算法。我们可以使用这些算法可以增加数据的安全性在休息,在使用中或运动中。

4.2。在实践中加密

应用程序中的一个非常常见的用例是存储用户密码。我们在稍后的时间点使用此用于身份验证。现在,很明显,存储纯文本密码会妥协安全性。

因此,一种解决方案是以一种过程是可重复的、但只是单向的方式打乱密码。这个过程被称为密码哈希函数,SHA1就是这样一种流行的算法。

那么,让我们看看如何在Java中做到这一点:

messagdigest md = messagdigest . getinstance(“SHA-1”);hashhedpassword = md.digest(“密码”.getBytes());

这里,信息摘要是我们感兴趣的加密服务。我们是使用方法getInstance()向任何可用的安全提供者请求此服务

5.公钥基础设施

公钥基础设施(Public Key Infrastructure, PKI)是指设置,可以使用公钥加密来实现通过网络安全交换信息。此设置依赖于在涉及通信的各方之间构建的信任。此信任基于由中立和可信任权限颁发的数字证书,称为证书颁发机构(CA)。

5.1。PKI在Java中支持

Java平台有API促进数字证书的创建,存储和验证

  • 密钥存储库:Java提供了密钥存储库Cryptography密钥和可信证书的持久存储类。这里,密钥存储库可以代表密钥商店和信任存储文件。这些文件有相似的内容,但它们的用法不同。
  • CERTSTORE.:此外,Java具有CERTSTORE.类,它表示可能不受信任的证书和撤销列表的公共存储库。我们需要找回证书和撤销名单用于证书路径构建以及其他用途

Java有A.称为“cacerts”的内置信任存储包含众所周知的CAS的证书。

5.2。PKI的Java工具

Java有一些非常方便的工具来促进可信的通信:

  • 有一个名为“keytool”的内置工具,可创建和管理密钥商店和信任商店
  • 还有另一个工具“Jarsigner”,我们可以用来签名和验证JAR文件

5.3。使用Java中的证书

让我们看看如何使用Java中的证书来使用SSL建立安全连接。相互身份验证的SSL连接需要我们做两件事:

  • 目前的证书 - 我们需要向沟通中的另一方提供有效证书。为此,我们需要加载密钥库文件,我们必须拥有我们的公钥:
KeyStore KeyStore = KeyStore. getinstance (KeyStore. getdefaulttype ());char[] keyStorePassword = "changeit".toCharArray();try(InputStream keyStoreData = new FileInputStream(" keyStore. jks")){密钥库。负载(keyStoreData keyStorePassword);}
  • 验证证书 - 我们还需要验证通信中另一方呈现的证书。为此,我们需要加载Trust-Store,我们必须从其他方面拥有以前可信赖的证书:
KeyStore trustStore = KeyStore. getinstance (KeyStore. getdefaulttype ());//像以前一样从文件系统加载信任存储

我们很少需要通过编程来做这个,通常在运行时将系统参数传递给Java:

-Djavax.net.ssl.trustStore = truststore.jks -Djavax.net.ssl.keyStore = keystore.jks

6.身份验证

身份验证是验证用户所呈现的身份的过程或基于其他数据(如密码、令牌或目前可用的各种其他凭据)的机器。

6.1。用Java身份验证

Java API使用可插拔的登录模块为应用程序提供不同的(通常是多种)身份验证机制。logincontext.提供这个抽象,它反过来引用配置并加载适当的loginmodule.

虽然多个提供者提供了它们的登录模块,Java有一些可用的默认值使用:

  • Krb5loginmodule.,基于Kerberos的身份验证
  • JndiLoginModule,用于由LDAP存储支持的基于用户名和密码的身份验证
  • keystoreloginmodule,用于基于加密键的身份验证

6.2。按示例登录

最常见的身份验证机制之一是用户名和密码。让我们看看如何实现这一点JndiLoginModule

该模块负责从用户那里获取用户名和密码,并根据JNDI中配置的目录服务进行验证:

logincontext logincontext = new logincontext(“sample”,new samplecallbackhandler());logincontext.login();

在这里,我们使用一个实例logincontext.执行登录logincontext.在登录配置中获取条目的名称 - 在这种情况下,它是“示例”。此外,我们必须提供一个实例CallbackHandler., 使用loginmodule.它与用户进行交互,获取用户名和密码等详细信息。

让我们看一下登录配置:

示例{com.sun.security.auth.module.jndiloginmodule所需;};

很简单,它表明我们正在使用JndiLoginModule作为一个强制性的loginmodule.

7.安全通信

通过网络的通信容易受到许多攻击向量的影响。例如,有人可以点击网络并在转移时读取我们的数据包。多年来,该行业已建立许多协议来确保这种沟通。

7.1。安全通信的Java支持

Java提供了保护网络通信的api加密,消息完整性和客户端和服务器身份验证

  • SSL / TLS:SSL及其继承者TLS通过数据加密和公钥基础架构提供不受信任的网络通信的安全性。Java通过支持SSL / TLS的支持sslsocket.在包中定义“java.security.ssl“。
  • SASL:简单身份验证和安全层(Simple Authentication and Security Layer, SASL)是客户端和服务器之间的身份验证标准。Java支持SASL作为包的一部分”java.security.sasl“。
  • GGS-API/Kerberos:通用安全服务API (GSS-API)通过Kerberos v5等各种安全机制提供对安全服务的统一访问。Java支持GSS-API作为包的一部分”java.security.jgss.“。

7.2。SSL沟通在行动中

让我们现在看看我们如何与其他方打开安全的连接Java使用sslsocket.

SocketFactory Factory = SSLSocketFactory.getDefault();尝试(套接字连接= factory.createSocket(主机,端口)){BufferedReader Input =新BufferedReader(New InputStreamReader(Connection.getInputStream()));返回input.readline();}

在这里,我们正在使用SSLSocketFactory创建sslsocket.。作为此类的一部分,我们可以设置像密码套件等可选参数以及哪些协议使用。

为了让它正常工作,我们必须创建并设置密钥存储库和信任存储库正如我们之前看到的。

8.访问控制

访问控制是指保护像文件系统等敏感的资源或者未经授权访问的代码库。这通常是通过限制对这些资源的访问来实现的。

8.1。Java中的访问控制

我们可以实现Java中的访问控制使用课程政策允许通过介导SecurityManagerSecurityManager是". lang“包并负责在Java中执行访问控制检查。

当类加载器在运行时加载类时,它会自动授予封装在封装中的类的默认权限允许目的。除了这些默认权限之外,我们可以通过安全策略将更多杠杆汇集到课程。这些由班级代表政策

在代码执行序列期间,如果运行时遇到对受保护资源的请求,SecurityManager验证请求允许对安装政策通过调用堆栈。因此,它要么授予权限,要么抛出权限SecurityException

8.2。java政策工具

的默认实现政策从属性文件读取授权数据。但是,这些策略文件中的策略条目必须采用特定的格式。

Java船用“policytool”,一个要撰写策略文件的图形实用程序。

8.3。通过示例访问控制

让我们看看我们如何限制对java中的文件(如文件)的资源:

SecurityManager = System.getSecurityManager();if (securityManager != null) {securityManager. name = " securityManager ";checkPermission(new FilePermission("/var/logs", "read"));}

在这里,我们使用SecurityManager验证我们的读取请求,包装FilePermission

但,SecurityManager将此请求委托给AccessController的AccessController的内部使用安装政策到达决定。

让我们看一下策略文件的示例:

grant {permission java.security.FilePermission <>, "read";};

我们基本上授予每个人的所有文件的读取权限。但,我们可以通过安全策略提供更细粒度的控制

值得注意的是SecurityManager默认情况下可能无法在Java中安装。我们可以通过始终使用参数启动Java来确保这一点:

-Djava.security。/ / sample.policy经理-Djava.security.policy = /路径

9.XML签名

XML签名是在保护数据和提供数据完整性方面有用。W3C为XML签名的治理提供了建议。我们可以使用XML签名来保护任何类型的数据,比如二进制数据。

9.1。Java中的XML签名

Java API支持生成和验证XML签名根据建议的指导方针。Java XML数字签名API封装在包中“java.xml.crypto“。

签名本身只是XML文档。XML签名可以是三种类型:

  • 分离的:这种类型的签名位于signature元素外部的数据之上
  • 包络:此类型的签名是签名元素内部的数据
  • 封闭的:这种类型的签名位于包含signature元素本身的数据之上

当然,Java支持创建和验证所有上述类型的XML签名。

9.2。创建XML签名

现在,我们将汇总我们的袖子并为我们的数据生成XML签名。例如,我们可能会在网络上发送XML文档。金宝搏官网188be因此,我们希望我们的收件人能够验证其完整性

那么,让我们看看如何在Java中实现这一点:

XMLSignatureFactory XMLSignatureFactory = XMLSignatureFactory. getinstance ("DOM");DocumentBuilderFactory DocumentBuilderFactory = DocumentBuilderFactory. newinstance ();documentBuilderFactory.setNamespaceAware(真正的);Document Document = documentBuilderFactory . newdocumentbuilder()。解析(新FileInputStream(“data.xml”));DOMSignContext DOMSignContext = new DOMSignContext(keyEntry.getPrivateKey(), document.getDocumentElement());XMLSignature XMLSignature = xmlSignatureFactory。newXMLSignature (signedInfo keyInfo);xmlSignature.sign (domSignContext);

要澄清,我们正在为文件中存在的数据生成XML签名“data.xml”。同时,关于这段代码有几点需要注意:金宝搏官网188be

  • 首先,XMLSignitureFactory.是用于生成XML签名的工厂类吗
  • XMLSignTaure.需要一个SignedInfo.对象,在其上计算签名
  • XMLSignTaure.也需要KeyInfo,它封装了签名密钥和证书
  • 最后,XMLSignature.使用封装为的私钥对文档进行签名DOMSignContext

作为一个结果,XML文档现在将包含签名元素,可用于验证其完整性。

10.Java核心之外的安全性

正如我们现在所看到的,Java平台提供了编写安全应用程序所需的许多功能。然而,有时,这些都是非常低级的,不能直接应用于,例如,web上的标准安全机制。

例如,在我们的系统上工作时,我们一般不想读全部oauth rfc并实施自己。我们通常需要更快、更高层次的方法来实现安全性。这就是应用程序框架发挥作用的地方——它们帮助我们用更少的样板代码实现我们的目标。

而且,在Java平台上 -通常这意味着Spring安全性。该框架是春季生态系统的一部分,但它实际上可以在纯粹的弹簧应用外部使用。

简单来说,它有助于以简单,声明的,高级方式实现身份验证,授权和其他安全功能。

当然,Spring Security被广泛地覆盖了118bet网娱乐 ,以及以引导的方式,在学习Spring Security课程

11.结论

简而言之,在本教程中,我们介绍了Java的高级安全体系结构。此外,我们还了解了Java如何为我们提供一些标准加密服务的实现。

我们还看到了一些常见的模式,我们可以应用这些模式在身份验证和访问控制等领域实现可扩展和可插入的安全性。

总之,这只是为我们提供了对Java安全特性的一瞥。因此,本教程中讨论的每个领域都值得进一步探索。但希望,我们应该有足够的洞察力开始这个方向!

安全底

我刚宣布了新的学习春天安全课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>查看课程
Java底部

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>查看课程
对这篇文章的评论关闭!