encryption - 安全与认证 : SSL vs SASL

标签 encryption ssl md5 kerberos sasl

我的理解是 SSL 结合了加密算法(如 AES、DES 等)和 key 交换方法(如 Diffie-Hellman),以在不安全网络(如 Internet)上的两个端点之间提供安全的加密和识别服务.

我的理解是 SASL 是一种 MD5/Kerberos 协议(protocol),几乎可以做同样的事情。

所以我的问题是:选择两者的利弊是什么,哪些场景更可取?基本上,我正在寻找在选择 SSL 或使用 SASL 时要遵循的一些准则。提前致谢!

最佳答案

比较 SSL/TLS 和 SASL 是相当困难的,因为 SSL/TLS 是一种通信协议(protocol),而 SASL 是一个框架,与其他协议(protocol)集成在一起。 (实际上,在某些情况下,您可以同时使用两者。)

此外,您提到了 Kerberos,它确实是一种身份验证协议(protocol)(可以与 SSL/TLS 或 SASL 一起使用,或者两者都独立使用)。您的问题似乎表明是否使用 Kerberos 是您应该首先选择的主要子问题之一。

SASL 本质上是一个间接层,允许在现有应用程序协议(protocol)(例如 LDAP、SMTP、Subversion 等)中实现可插入的身份验证系统和数据安全,尽管这些协议(protocol)需要知道这个扩展(例如 SMTP auth)。它是否以及如何提供安全的身份验证和数据加密在很大程度上取决于什么 underlying mechanism在这个框架内使用。以下是来自 svnserve documentation 的示例:“内置的 CRAM-MD5 机制不支持加密,但 DIGEST-MD5 支持”。
如果您想将 Kerberos 与 SASL 一起使用,您将需要另一个间接级别:GSS-API (最常与 Kerberos 一起使用,但也可以用于其他机制)。 (请注意,SASL 上下文中的 GSSAPI 似乎意味着 Kerberos,这与它的 GS2 successor 不同。)

SSL/TLS 的一般目标是保护客户端和服务器之间的通信(完整性和 secret 性)。客户端应该始终检查 SSL/TLS 服务器的身份,它也为服务器提供了检查客户端身份的机制。它可以做什么还取决于它的配置方式。 SSL/TLS 最常与 X.509 证书一起使用:这是浏览器可以检查 HTTPS 服务器身份的方式。服务器还可以配置为请求客户端使用证书来标识自己(客户端证书身份验证)。
但是,如果要使用 Kerberos,则可以使用 TLS Kerberos cipher suites .这不太常见,但它们是 implemented in the JSSE .

它的实现通常提供类似于使用普通 TCP 连接所获得的 API:在 Java 中,一旦配置,您或多或少可以使用 SSLSocket就像使用普通 Socket 一样.这不需要套接字顶部协议(protocol)的特定意识,尽管某些协议(protocol)具有从普通连接 ( Implicit v.s. Explicit SSL/TLS ) 切换到 SSL/TLS 的显式命令。它还可以提供身份验证。在 Java 中,JSSE是默认的 SSL/TLS 实现,它使您可以访问 SSLSocket (或者 SSLEngine 如果你足够勇敢的话)。

您可能想阅读“When to use Java GSS-API vs. JSSE”,它类似于“SASL vs. SSL/TLS”(尽管它似乎已经有一段时间没有更新了,因为 JSSE 现在确实支持 Kerberos 密码套件,至少自 Oracle Java 6 起)。

我承认我对 SASL 的了解少于对 SSL/TLS 的了解,但是通过 SASL 进行数据加密听起来似乎需要更多的工作。它似乎没有某些 SSL/TLS 功能,例如 Perfect Forward Secrecy offered by EDH cipher suites .有一个example that uses SASL with GSSAPI (Kerberos here) in the JGSS tutorial :您需要显式包装/解开数据,而在使用 SSLSocket 时您不必这样做s。

我认为您主要关心的应该是首先决定要使用哪种身份验证机制:Kerberos、X.509 证书或其他什么。这将对您的整体架构产生更大的影响,并且两者都可以与 SASL 和 SSL/TLS 一起使用(如果您在 SSL/TLS 连接之上使用具有 EXTERNAL 机制的 SASL,则更是如此)。

  • Kerberos 非常集中。除了能够联系您的应用程序服务器之外,客户端还需要能够联系 KDC 进行身份验证。客户端还需要配置为使用该 KDC。从用户的角度来看,他们可以使用密码。
  • X.509 更加分散。但是,您可能需要为您的用户证书部署证书颁发机构(或使用商业证书颁发机构)。用户需要获得证书和私钥,有些人可能会觉得这太复杂了。

  • JAAS 出现是因为它是处理身份验证和授权的通用 Java 框架。它与安全管理器的概念密切相关。它为您提供了 Subject and Principal 的概念.这并不直接与协议(protocol)或通信相关联,而是与您在应用程序中对身份验证和授权进行建模的方式相关。 (它为您提供了一组标准的类来这样做。)

    (我通常建议查看 Java reference documents,其中提到了您想要的词:JGSS、SASL ……,尽管它们不一定容易阅读。)

    关于encryption - 安全与认证 : SSL vs SASL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11347304/

    相关文章:

    ssl - 如何使 SSL 与 1and1 和 heroku 一起工作

    Windows 2003 Server 无法连接到 SSL 网站

    linux - 命令 'md5sum' 最后没有 '-' token

    python - 密码必须至少包含一个大写或小写和一个数字

    c# - 如何为加密算法创建加密 key ?

    macos - 如何将 OpenSSL 版本从 0.9.8zg 更新到 1.0.2e

    java - 将 32 位长十六进制转换为 6 位数字 OTP

    java - 为什么 MD5 哈希计算的一种函数对于较小的文件更适合,但对于大文件却效率较低?

    c# - C++ .NET DLL 与 C# 托管代码? (文件加密 AES-128+XTS)

    security - 如何安全地将数据作为 URL 中的参数发送?