一、身份验证协议

1、OAuth

        关于 OAuth实际上是什么存在很多混淆。有些人认为 OAuth 是一种登录流程(例如,当您使用 Google Login 登录应用程序时),有些人认为 OAuth 是一种“安全性的东西”。

        首先,OAuth不是API 或服务:它是授权的开放标准,任何人都可以实现它。

        更具体地说,OAuth 是应用程序可用来为客户端应用程序提供“安全委托访问”的标准。OAuth通过HTTPS工作,并使用访问令牌而不是凭据对设备、API、服务器和应用程序进行授权。        

        如今,OAuth 2.0 是使用最广泛的 OAuth 形式。所以,当提起“OAuth”时,指的是OAuth2.0。

    OAuth 定义了四个角色:

        资源所有者:能够授予对受保护资源的访问权限的实体。当资源所有者是一个人时,它被称为最终用户。

        资源服务器:托管受保护资源的服务器,能够接受并使用访问令牌响应受保护的资源请求。

        客户:代表受保护资源请求的应用程序资源所有者及其授权。“客户”一词确实不暗示任何特定的实现特征(例如,应用程序是否在服务器、桌面或其他设备上执行设备)。

        授权服务器:服务器成功后向客户端颁发访问令牌验证资源所有者并获得授权。

java grpc 身份认证 java身份验证框架_java

        OAuth 2.0是一个框架,用于控制对受保护资源(例如应用程序或一组文件)的授权。OAuth 有点像房子的规则,它规定了一个人在里面可以做什么和不能做什么。 

        比如.net core的auth2框架ids4。全称:IdentityServer4。或者Java的spring security也支持auth2。

2、SAML

        SAML全称是安全断言标记语言(Security Assertion Markup Language)是一个基于XML的开源标准数据格式。用于在不同的安全域之间交换认证和数据授权。在SAML标准定义了身份提供者(IDP)和服务提供者(SP),这两者构成了前面所说的不同的安全域。 SAML是OASIS组织安全服务技术委员会(Security Services Technical Committee)的产品。

        SAML解决的最重要的需求是Web端应用的单点登录(SSO)。

        SAML 协议主要有三个角色:

        SP(Service Provider):向用户提供服务的web 端应用。

        IDP(Identity Provide):向SP提供用户身份信息

        用户:通过登录IDP获取身份断言,并向SP返回身份断言来使用SP提供的服务。

java grpc 身份认证 java身份验证框架_Spring Security_02

        SAML 有点像房门钥匙。它允许您访问该设施。

3、OpenID Connect 

        OpenID Connect 基于 OAuth 2.0 协议构建,并使用称为 ID 令牌的附加 JSON Web 令牌 (JWT) 来标准化 OAuth 2.0 留给选择的区域,例如范围和端点发现。它特别专注于用户身份验证,并广泛用于在消费者网站和移动应用程序上启用用户登录。

        它允许客户端根据授权服务器执行的身份验证验证最终用户的身份,并以可互操作和类似 REST 的方式获取有关最终用户的基本配置文件信息。

        OpenID Connect 允许所有类型的客户端(包括基于 Web、移动和 JavaScript 的客户端)请求和接收有关经过身份验证的会话和最终用户的信息。该规范套件是可扩展的,允许参与者在对他们有意义的情况下使用可选功能,例如身份数据加密、OpenID 提供者发现和会话管理。

OpenID Connect | OpenID

java grpc 身份认证 java身份验证框架_java_03

https://openid.net/connect/        oAuth2.0协议是用来获取对受保护的资源比如某些web api调用所需的access token的。OpenID Connect则利用了oAuth2.0的这个流程来允许RP(三方应用)获取用户的身份信息。这些信息是以JWT形式进行交互的id token。同时,OpenID Connect还允许RP用获取id token时由OP一并返回的access token来进一步获取用户的个人信息,比如email、手机号码等。

java grpc 身份认证 java身份验证框架_java grpc 身份认证_04

        非常常见的就是我们经常使用的是第三方登陆等。

4、kerberos

        Kerberos (KRB5) 是一种成熟、灵活、开放且非常安全的网络身份验证协议。Kerberos 包括身份验证、相互身份验证、消息完整性以及机密性和委托功能。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。麻省理工学院可免费实施该协议。Kerberos 也可用于许多商业产品。

        MIT的Kerberos网址。

Kerberos: The Network Authentication Protocol

java grpc 身份认证 java身份验证框架_java_03

https://web.mit.edu/kerberos/        Kerberos 由 MIT 创建,用于解决网络安全问题。Kerberos 协议使用强加密,因此客户端可以通过不安全的网络连接向服务器证明其身份(反之亦然)。在客户端和服务器使用 Kerberos 证明他们的身份之后,他们还可以加密他们的所有通信,以确保他们开展业务时的隐私和数据完整性。

        Kerberos提供了一个集中的认证服务器。在 Kerberos 中,身份验证服务器和数据库用于客户端身份验证。Kerberos 作为第三方可信服务器运行,称为密钥分发中心 (KDC)。网络上的每个用户和服务都是一个主体。 

        Kerberos 的主要组件有:

        身份验证服务器 (AS):身份验证服务器执行票证授予服务的初始身份验证和票证。            数据库:Authentication Server 验证用户在数据库中的访问权限。            Ticket Granting Server (TGS):Ticket Granting Server 为服务器签发票据 

        基本步骤

        1、客户端从密钥分发中心 (KDC) 请求身份验证票 (TGT)。

        2、KDC 验证凭据并发回加密的 TGT 和会话密钥。

        3、客户端请求访问服务器上的应用程序。应用程序服务器的票证请求被发送到由客户端的 TGT 和身份验证器组成的 KDC。

        4、KDC 向用户返回票证和会话密钥。

        5、票证被发送到应用程序服务器。一旦收到票证和身份验证器,服务器就可以对客户端进行身份验证。

        6、服务器使用另一个身份验证器回复客户端。接收到这个验证器后,客户端可以验证服务器。

java grpc 身份认证 java身份验证框架_身份验证协议_06

        要是使用Kerberos,必须单独修改每个应用。

        尽管 Kerberos 在数字世界中随处可见,但它通常用于依赖强大的身份验证和审计功能的安全系统中。Kerberos 用于 Posix、Active Directory、NFS 和 Samba 身份验证。它也是 SSH、POP 和 SMTP 的替代身份验证系统。

5、LDAP

        LDAP 服务提供通用目录服务。它可以用来存储各种信息。所有 LDAP 服务器都有一些系统来控制谁可以读取和更新目录中的信息。

        要访问 LDAP 服务,LDAP 客户端首先必须对服务进行身份验证。也就是说,它必须告诉 LDAP 服务器谁将访问数据,以便服务器可以决定允许客户端查看和执行什么操作。如果客户端向LDAP服务器认证成功,那么当服务器随后收到客户端的请求时,会检查是否允许客户端执行该请求。这个过程称为访问控制。

        LDAP 标准提出了 LDAP 客户端可以向 LDAP 服务器进行身份验证的方法( RFC 2251 和 RFC 2829)。这些将在 LDAP 身份验证部分和 身份验证机制部分进行一般性讨论。本课还包含有关如何使用 匿名、 简单和 SASL身份验证机制的说明。

        LDAP 服务的另一个安全方面是支持使用安全通道与客户端进行通信,例如发送和接收包含密码和密钥等机密的属性。LDAP 服务器为此目的使用 SSL。

        典型应用场景

        网络服务:DNS服务         统一认证服务:         Linux PAM (ssh, login, cvs. . . )         Apache访问控制         各种服务登录(ftpd, php based, perl based, python based. . . )         个人信息类,如地址簿         服务器信息,如帐号管理、邮件服务等

6、RADIUS

        远程身份验证拨入用户服务 ( RADIUS ) 是一种网络协议,它为连接和使用网络服务的用户提供集中的身份验证、授权和记帐(AAA 或 Triple A)管理。

        RADIUS 身份验证在用户请求通过远程访问服务器 (RAS) 访问网络资源时开始。用户输入用户名和密码,由RADIUS服务器加密,然后通过身份验证过程发送。

        然后 RADIUS 服务器通过使用身份验证方案验证数据来检查信息的准确性。这是通过将用户提供的信息与本地存储的数据库进行比较或引用外部资源(如 Active Directory 服务器)来完成的。

        然后,RADIUS 服务器将通过接受、挑战或拒绝用户来响应。个人用户可能会被授予受限访问权限,而不会影响其他用户。在质询的情况下,RADIUS 服务器会向用户请求其他信息以验证他们的用户 ID - 这可能是 PIN 或二级密码。在拒绝的情况下,用户将被无条件地拒绝对 RADIUS 协议的所有访问。

java grpc 身份认证 java身份验证框架_java grpc 身份认证_07

7、CAS

        中央身份验证服务 (CAS) 是 Web 的单点登录协议。其目的是允许用户访问多个应用程序,同时仅提供一次凭据(例如用户 ID 和密码),同时允许应用程序验证用户身份,而无需访问这些凭据(例如密码)。CAS 这个名字也指的是实现这个协议的一个软件包,它最近已经成为 Shibboleth IdP v3 包的一部分。由于 Gluu CE 包含 Shibboleth 以添加对 SAML 协议流的支持,因此它包含了所有与 CAS 相关的功能。CAS 协议的最新版本是 3。

CAS | Apereo

java grpc 身份认证 java身份验证框架_java_03

https://www.apereo.org/projects/cas        如果不是旧的系统中有使用,可能现在应用的感觉就较少了。

8、JWT

        JWT 是 JSON Web Token 的缩写,它是一种紧凑的 URL 安全方式,用于表示要在两方之间传输的声明。JWT 中的声明被编码为使用 JSON Web 签名 (JWS) 进行数字签名的 JSON 对象。

        简而言之,JWT token 是我们在发出网络请求以安全地传递数据并确保它没有被篡改时传入 header 或 url 的字符串。

        JWT 令牌的一种非常常见的用途,也是您可能只应该使用 JWT 的用途,是作为一种API 身份验证机制。

        JWT是一种令牌格式,OAuth 2.0 是一种协议(可选使用 JWT 作为令牌格式),实际上很多应用都是OAuth2结合JWT使用。

java grpc 身份认证 java身份验证框架_安全框架_09

         JWT 令牌包括以下元素

        1、标头:算法和令牌类型

{ 
    "alg":"HS256",
    "typ”:"JWT"
}

        然后,这个 JSON 被 Base64Url 编码以形成 JWT 的第一部分。 

'use strict';

var header = { "alg": "HS256", "typ": "JWT" };
var enc_header = Buffer.from(JSON.stringify(header)).toString('base64');
// ► "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"

        2、有效数据

{ 
    "sub":"1234567890",
    "name":"John Doe",
    "admin":true 
}

        然后对有效负载进行 Base64Url 编码以形成 JSON Web 令牌的第二部分。

'use strict';

var payload = { "exp": "2019-02-14", "message": "roses are red" };
var enc_payload = Buffer.from(JSON.stringify(payload)).toString('base64');
// ► eyJleHAiOiIyMDE5LTAyLTE0IiwibmFtZSI6IkpvaG4gRG9lIn0

        3、签名

        要创建签名部分,您必须获取编码的标头、编码的有效数据、标头中指定的算法,并对其进行签名。

'use strict';
const crypto = require('crypto');
var jwt_secret = "secret";
// enc_header and enc_payload are computed earlier
var signature = crypto.createHmac('sha256', jwt_secret).update(enc_header +"."+ enc_payload).digest('base64');
// ► 6C46KAaZGp6RjbSqGllfdQF7g8vXCp02NTSrz-PzeoI

        最终的 JWT 令牌如下所示

var token = `${enc_header}.${enc_payload}.${signature}`;
// ► eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyMDE5LTAyLTE0IiwibWVzc2FnZSI6InJvc2VzIGFyZSByZWQifQ.0u-mkgLo5479CPjJJ4mXCwn2RW4dFT12fiYiopRWsZw

        JWT 令牌用于身份验证而不是加密,因此即使不知道密钥,也有人可以读取您的标头和有效负载数据。但是在收到令牌后,您可以使用您的密钥再次对标头和有效负载进行签名,并将其与收到的签名进行比较,以检测令牌或消息的篡改。

二、Java安全框架

        在开发应用程序时,安全性是一个主要问题。在 JAVA 中,有多个安全框架旨在使保护应用程序的过程更快、更容易、更成功。下面是一些通常用于 JAVA 程序、网站和 Web 应用程序的用户身份验证和授权的安全框架。

1、Spring Security

        因为spring security的功能很多,并且支持oauth2,所以非常的重量级,不如Shiro轻量级。但是Spring Security 提供一流的保护,以抵御 CSRF 和会话固定等攻击。

Spring SecurityLevel up your Java code and explore what Spring can do for you.https://spring.io/projects/spring-security        Spring Security 模块与所有其他 Spring 功能无缝集成。Spring Security 提供了多种身份验证技术,包括 HTTP BASIC、HTTP Digest、HTTP x-509、LDAP、用户名/密码、OpenID、预先建立的请求标头、JAAS、Kerberos 等等。

        它还提供了多种授权机制,包括授权Web请求、授权方法调用、授权访问域对象实例等。

2、Apache Shiro

        Apache Shiro 于 2004 年作为 JSecurity 诞生,并于 2008 年被 Apache 基金会接受。迄今为止,它已经发布了许多版本。

   Apache Shiro 是一个开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro 框架具有直观、易用等特性,同时也能提供健壮的安全性,虽然它的功能不如 Spring Security 那么强大,但是在常规的企业级应用中,也非常常用。

        Shiro 有四个基石——身份验证、授权、会话管理和加密。

        身份验证:有时称为“登录”,这是证明用户身份的行为。         授权:访问控制的过程,即决定谁访问什么。         会话管理:管理用户特定的会话,即使在非 Web 或 EJB 应用程序中也是如此。         密码学:通过使用加密算法保持数据安全且易于使用。

        此外,Shiro 还提供了额外的功能来解决不同环境下面临的安全问题。

        Web 支持:Shiro 的 Web 支持 API 可以轻松帮助保护 Web 应用程序。         缓存:缓存是 Apache Shiro 中的第一层公民,以确保安全操作快速高效。         并发:Apache Shiro 使用其并发特性来支持多线程应用程序。         测试:存在测试支持以帮助您编写单元测试和集成测试。         “运行身份”:允许用户假设另一个用户身份的功能(如果允许)。它有时在管理脚本时很有用。         “记住我”:在会话中记住用户的身份,这样用户在强制登录时只需要登录。

3、JAAS

        Java Authentication and Authorization Services,JAAS是Java安全框架的一部分,从JDK版本 1.4 开始直接集成到 JAVA 开发工具包中。

  JAAS 框架主要关注应用程序中用户的身份验证和授权。JAAS 是一个可插入的框架,允许应用程序保持独立于身份验证技术。实施 JAAS 安全框架时不需要修改应用程序。可以使用多种形式的身份验证,包括用户名/密码、语音、指纹、生物识别等。

        使用 JAAS 的授权与 JAVA SE 访问控制模块一起工作。如果用户认证成功,JAAS 框架会根据相关主体检查用户凭证。