Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous

SASL  的认证方式包括:

1. PLAIN:plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施。因此,使用plain机制时,你可能会想要结合tls。

2.DIGEST-MD5:使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输。验证过程是从服务器先提出challenge(质询)开始, 客户端使用此challenge与隐性密码计算出一个response(应答)。不同的challenge,不可能计算出相同的response;任何拥 有secret password的一方,都可以用相同的challenge算出相同的response。因此,服务器只要比较客户端返回的response是否与自己算 出的response相同,就可以知道客户端所拥有的密码是否正确。由于真正的密码并没有通过网络,所以不怕网络监测。

3. anonymous: 
anonymous机制对smtp没有意义,因为smtp验证的用意在于限制转发服务的使用对象,而不是为了形成open relay,sasl之所以提供这种机制,主要是为了支持其他协议。

PLAIN 方式的认证流程:

由于是在SASL的认证方式,所以客户端必须要打开SASL认证的模式。

config.setSecurityMode(SecurityMode.enabled);

config.setSASLAuthenticationEnabled( true);

并且在客户端要声明,客户端必须支持PLAIN模式:

SASLAuthentication.supportSASLMechanism("PLAIN");

这样再客户端接下的来的认证过程中就会传输:

<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">c3lzYWRtaW4Ac3lzYWRtaW4AMTIz</auth>
数据包,接下来服务器端就会对这个数据包进贤处理。

我的服务器端是结合中Openfire进行开发的,当数据包到达时,服务器端会进行如下处理:

if ("auth" .equals(tag))
{

// User is trying to authenticate using SASL

startedSASL = true;

// Process authentication stanza

saslStatus =
SASLAuthentication.handle(session,
doc);

在服务器端接下来的处理过程中,就是通过SaslServer 来进行客户端用户名和密码的认证。SaslServer进行java.sercurity 中的类。

SaslServer ss = Sasl.createSaslServer(mechanism,

"xmpp",
session.getServerName(), props,

new XMPPCallbackHandler());

这里主要使用SaslServer 创建SASL服务器端。

制创建一个 SaslServer。 此方法使用 JCA
Security Provider Framework
(在 "Java Cryptography Architecture API Specification & Reference" 中所有描述)来查找和选择 SaslServer 实现。 首先,它从 "SaslServerFactory" 服务的已注册安全提供者和指定的 SASL 机制中获得 SaslServerFactory 实例的有序列表。然后它在列表中的每个工厂实例上调用 createSaslServer(),直到某个调用生成一个非
null 的 SaslServer 实例为止。此方法返回非 null 的 SaslServer 实例,如果搜索无法生成非 null 的SaslServer 实例,则返回 null。

在这里在Openfire中的:org.jivesoftware.openfire.sasl 中的SaslServerFactoryImpl 类实现了,javax.security.sasl.SaslServerFactory,这样在创建SaslServer的时候,就会调用这个具体的实现来进行创建。

在这里在SASLAuthentication 的初始化过程中,在initMechanisms 方法中,就初始化了SaslServerFactory
的类的路径。

在程序运行过程中,就会根据客户端发送的PLAIN 模式,创建SaslServer,并进行处理。

在SaslServerPlainImpl 类中,可以获得客户端发送过来的用户名和密码,这里都是明文进行了传输,可以获得客户端发送的数据。这样
  在XMPPCallbackHandler 中就可以获得客户端发送的用户名和密码,然后接下来就是对用户的用户名和密码进行认证。

DIGEST-MD5 :

当服务器端支持  DIGEST-MD5 时,如果客户端不明确声明支持的认证方式,默认会使用 DIGEST-MD5
来进行客户端的认证。

在认证过程中客户端发送:<auth mechanism="DIGEST-MD5" xmlns="urn:ietf:params:xml:ns:xmpp-sasl"></auth>

服务器端,接收到消息后进行处理:

if (mechanisms .contains(mechanism))
{

// 被选的SASL的机制,需要服务器发送一个 challenge

System. out.println( "password------------call---back----"

+ mechanism);

try {

Map<String, String> props = new TreeMap<String,
String>();

props.put(Sasl. QOP, "auth");

if (mechanism.equals("GSSAPI" ))
{

props.put(Sasl. SERVER_AUTH, "TRUE");

}

SaslServer ss = Sasl.createSaslServer(mechanism,

"xmpp",
session.getServerName(), props,

new XMPPCallbackHandler());

// evaluateResponse doesn‘t like null parameter

byte[]
token = new byte[0];

if (doc.getText().length()
> 0) {

// If auth request
includes a value then validate it

token = StringUtils.decodeBase64(doc.getText()

.trim());

if (token
== null) {

token = new byte[0];

}

}

if (mechanism.equals("DIGEST-MD5" ))
{

// RFC2831 (DIGEST-MD5) says the client MAY provide

// an initial response on subsequent

// authentication. Java SASL does not (currently)

// support this and thows an
exception

// if we try. This violates the RFC, so we just

// strip any initial token.

token = new byte[0];

}

byte[]
challenge = ss.evaluateResponse(token);

if (ss.isComplete())
{

System. out.println( "ss------------------has---complete--------" );

authenticationSuccessful(session,

ss.getAuthorizationID(), challenge);

status = Status.authenticated;

else {

System. out.println( "ss----------not--------has---complete--------" );

// Send the challenge

sendChallenge(session, challenge);

status = Status.needResponse;

}

session.setSessionData( "SaslServer",
ss);

在这里服务器端接收客户端发送的数据信息,并且创建SaslServer ,在创建 SaslServer
server的时候,会在  java.security.Provider 中查询,服务器端设置的进行对认证方式实例化的类,,在这里继承的 java.security.Provider 的类中,没有定义对  DIGEST-MD5
的具体实现,就采用系统默认的方式来实例化 SaslServer。接下来的过程就是服务器端向客户端发送 challenge 数据包,

<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09InNtYXJ0Y29vbCIsbm9uY2U9Ind2aGNoTTFsS0dudXY0dFpOUDZxWlp3dG5WUENkTHRDUDdBNkVLcWoiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M=</challenge>

然后客户端发送,response 数据包进行匹配:

<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dXNlcm5hbWU9InN5c2FkbWluIixyZWFsbT0ic21hcnRjb29sIixjbm9uY2U9IjM3ZjJmNWUwMTQ3MWQ4ZWNkOWFmZWE1MjQyYWIyODMyMjE3MWNjOWNmNzU3MzczNTA1MGY2MjU1MjE2NTUzOTUiLG5jPTAwMDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvc21hcnRjb29sIixyZXNwb25zZT04ODBlMGU5YmYxZDYyMzI4Mjg5Nzg5MDYwNzAyNTQ5ZCxjaGFyc2V0PXV0Zi04LG5vbmNlPSJ3dmhjaE0xbEtHbnV2NHRaTlA2cVpad3RuVlBDZEx0Q1A3QTZFS3FqIg==</response>

然后也会调用对应的 NameCallBack 和 PasswordCallBack 来验证登录用户的用户名和密码。

当认证成功后,服务端发送:

<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cnNwYXV0aD1iNWI4YmQ5Y2NjYjAyYjNiMDcxMDgzNzA5NDJiZDA4Yg==</success>

这样客户端和服务器就认证成功了。

3.anonymous 匿名登录:

客户端在登录时,指明登录的方式,connection.loginAnonymously();

客户端在认证时,发送数据包:<auth mechanism="ANONYMOUS" xmlns="urn:ietf:params:xml:ns:xmpp-sasl"></auth> 指明认证的方式为:ANONYMOUS。

服务器端接收数据后,进行处理:

在处理时:

直接向客户端发送认证成功的数据包:

时间: 2024-12-14 02:31:51

Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous的相关文章

(转)Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous

转:http://blog.csdn.net/coding_me/article/details/39524137 SASL  的认证方式包括: 1. PLAIN:plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施.因此,使用plain机制时,你可能会想要结合tls. 2.DIGEST-MD5:使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输.验证过程是从服务器先提出cha

批量检测GoAhead系列服务器中Digest认证方式的服务器弱口令

最近在学习用python写爬虫工具,某天偶然发现GoAhead系列服务器的登录方式跟大多数网站不一样,不是采用POST等方法,通过查找资料发现GoAhead是一个开源(商业许可).简单.轻巧.功能强大.可以在多个平台运行的嵌入式Web Server.大多数GoAhead服务器采用了HTTP Digest认证方式,并且部分服务器采用了默认账号密码,于是萌生了针对GoAhead编写爬虫的想法,通过近8个小时的编程与调试,勉强写出了个简陋的脚本,现在拿出来分享,给刚接触python的新手参考下,也请求

在Openfire中使用自己的数据表之修改配置文件

目前我使用的Openfire版本是3.10.3,以下使用说明也是在这个版本上做的修改. Openfire提供了两种方式使用用户数据表.一种是安装完成之后默认实现的org.jivesoftware.openfire.user.DefaultUserProvider,一种是org.jivesoftware.openfire.user.JDBCUserProvider,同样对于用户验证也提供了默认实现的org.jivesoftware.openfire.auth.DefaultAuthProvider

Linux中Postfix邮件认证配置(五)

Postfix+Dovecot+Sasl工作原理 1.A用户使用MUA客户端借助smtp协议登陆smtpd服务器,需要先进行用户和密码认证,而SMTPD服务器端支持sasl认证,例如有一个sasl客户端,就会去连接SASL.当SASL接受到验证请求时就会根据验证方式去进行验证,常用的有PAM,passwd等.验证成功后就会返回给Smtpd服务器.而smtpd就会允许A用户登陆发送邮件. 2.Smtpd服务器接受到邮件转发请求后,查看邮件是本域的还是外部域的,如果是本域内的用户,就会开启MDA进程

ios开发使用Basic Auth 认证方式

我们app的开发通常有2种认证方式   一种是Basic Auth,一种是OAuth:现在普遍还是使用OAuth的多,而使用Basic Auth认证的少,正好呢我今天给大家介绍的就是使用的比较少的Badic Auth认证方式,这种认证方式开发和调试简单, 没有复杂的页面跳转逻辑和交互过程,更利于发起方控制.然而缺点就是安全性更低,不过也没事,我们可以使用https安全加密协议,这样才更安全. 我使用的是AFNetworking发送的网络请求,因此我们用Basic Auth认证方式就不能再使用AF

修改SQL Server登陆认证方式

在安装Sqlserver的过程中,默认情况下是Windows认证方式,安装之后若想修改认证方式,则需要按如下步骤操作. 1.登陆Sql Server Management Studio,右击数据库引擎,点击属性: 2.在服务器属性对话框中,点击“安全性”选项,并在右边选择“SQL Server和Windows混合身份验证模式”,并点击确定. 3.在Management Studio的对象资源管理器中,逐一点开服务器引擎->安全性->登录名. 4.如果不想用sa,或者没有sa,则在登录名上右击选

修改CAS源码是的基于DB的认证方式配置更灵活

最近在做CAS配置的时候,遇到了数据源不提供密码等数据的情况下,怎样实现密码输入认证呢? 第一步:新建Java项目,根据假面算法生成CAS加密工具 出于保密需要不提供自定义的加密工具,在您的实际项目中,你可采用cas默认的加密方式比如md5. 第二步:修改CAS源码 找到cas-server-support-jdbc子模块找到包路径cas-server-support-jdbc\src\main\java\org\jasig\cas\adaptors\jdbc\,在复制一份QueryDataba

Django 中的用户认证

Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任务的二进制(是/否)标志. 组:一种为多个用户加上标签和权限的常用方式. 消息:一种为指定用户生成简单消息队列的方式. Deprecated in Django 1.2: 认证系统的消息部分将会在 Django 1.4 版中去除. 安装 认证系统打包在 Django 的 django.contrib

oracle 认证方式

Oracle登录的时候有两种认证方式,一种是“操作系统认证”,一种是“口令文件认证”.1.当采取操作系统认证的时候,在本地用任何用户都可以以sysdba登陆:(默认方式)2.当采取口令文件认证的时候,就不是任何用户都可以用sysdba登陆了,这个时候必须输入正确的用户名口令才可以(其实这种方法才是安全的)3.至于你本地的到底采用哪种认证方式,是可以通过parameter来设置的. ORACLE数据库通过sqlnet.ora文件中的参数sqlnet.authentication_services,