课题:
编写一个Android应用,访问一个基于Http服务的数据服务系统,为了提高安全性,该数据服务系统采用了Http Digest认证体系,理由是,相比基本认证方式而言,Digest认证可以保证认证信息(用户名和密码)的传输安全,同时比SSL简单易用。在使用浏览器访问时,会提示一个用户名和密码对话框,但如果是程序访问,就需要在程序访问过程中编程提供认证信息。
要求:
-- 在程序中可以设置用户名和密码
-- 可以通过网络访问基于Digest认证和Http数据服务(JSON格式)
-- 使用Android基本库,不使用其他扩展库(基于兼容性考虑)
-- 支持Android2.2以上系统
-- 技术实现简单清晰
实现:
网络上提供的一些解决方案都有一些问题,如需要使用第三方的类库,创建认证器,手工设置请求参数等等,都比较麻烦,而且问题很多,经过摸索,我在程序中实现了基于Android标准库的认证过程,实现思路、过程和示例代码如下:
基础逻辑是:
--- 使用HttpClient(DefaultHttpClient)类连接服务器并获取数据
DefualtHttpClient 类:创建client对象
excuete(HttpGet)方法:执行连接和获取,参数是一个HttpGet对象
HttpGet类:基于url创建HttpGet对象
HttpResponse类: execute的返回值
getEntiry().getContent() 方法:获取数据流
--- 该client访问需要认证的资源需要一个认证方法,就需要设置一个认证提供者
client的 setCredentialsProvider(bcp) 方法:设置认证提供者
BasicCredentialsProvider 类:创建认证提供者实例
setCredentials 方法:设置AuthScope和UsernamePasswordCredentials类
AuthScope类:认证范围,基于主机,端口和领域构建
UsernamePasswordCredentials:基于用户名和口令的证书,基于用户名和口令构建
实现代码如下:
// 1. 获取并设置url地址,一个字符串变量,一个URL对象
String urlStr ="http://<host>:<port>/data.json";
URL url= new URL(urlStr);
// 2. 创建一个密码证书,(UsernamePasswordCredentials类)
String username="foo";
String password="bar";
UsernamePasswordCredentials upc = new UsernamePasswordCredentials(username, password);
// 3. 设置认证范围 (AuthScore类)
String strRealm = "<mydomain>";
String strHost = url.getHost();
int iPort = url.getPort();
AuthScope as = new AuthScope(strHost, iPort, strRealm);
// 4. 创建认证提供者(BasicCredentials类) ,基于as和upc
BasicCredentialsProvider bcp=new BasicCredentialsProvider();
bcp.setCredentials(as, upc);
// 5. 创建Http客户端(DefaultHttpClient类)
DefaultHttpClient client=new DefaultHttpClient();
// 6. 为此客户端设置认证提供者
client.setCredentialsProvider(bcp);
// 7. 创建一个get 方法(HttpGet类),基于所访问的url地址
HttpGet hg= new HttpGet(urlStr);
// 8. 执行get方法并返回 response
HttpResponse hr = client.execute(hg);
// 9. 从response中取回数据,使用InputStreamReader读取Response的Entity:
String line=null;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(hr.getEntity().getContent() ));
while((line = reader.readLine()) != null) builder.append(line);
strContent=builder.toString();
总结
--- 对比Java中的实现,可以看到Andriod中的apache.http库和commons-httpclient库有比较大的结构和实现上的差异,这个原因导致了基于Java的实现不能直接移植到Android上。
--- 上述的实现简单、逻辑清楚而容易理解,并且不涉及到更复杂的Digest认证的技术细节,而是由CredentialsProvider封装了。
--- 上述实现没有使用通常的connection类,而是client类,提供更丰富的连接和状态控制功能,相比较而言,connection更加简单
--- 用户名和密码作为认证框架中的参数而不是http request的组成部分,更加安全
--- 这里没有讨论服务器端的实现,实际上我是通过Rails来实现http digest的。但理论上这种认证方式是标准。
分享到:
相关推荐
针对PB 开发者,并需要访问Digest Authentication认证。 该案例是通过PB 2019 R3 Build 2170版本来开发的。需要使用到PB 2017 版本后的新功能httpclient对象及加密对象。
在Android平台上实现ONVIF协议,可以让我们在移动设备上访问和控制支持ONVIF的视频监控设备。 首先,实现ONVIF服务的Android应用需要理解ONVIF规范中的主要组件:设备管理、媒体服务和定位服务。设备管理服务用于...
摘要报头是指在HTTP报头中用于传输摘要值的报头,它是HTTP Digest Authentication的核心组件。 RFC 2617中文版为读者提供了一个详细的HTTP Digest Authentication指南,帮助读者更好地理解和使用该鉴别机制。
在Android平台上实现Onvif(Open Network Video Interface Forum)IPC(IP Camera)功能,主要是为了与网络摄像机进行通信和控制。Onvif是一个开放的标准,定义了IP视频监控设备的接口规范,使得不同厂商的设备能...
Onvif设备通常支持基本的HTTP认证、 Digest认证和TLS/SSL证书认证。应用需要根据摄像头的具体配置进行相应的认证方式。 3. **媒体服务**: - 一旦认证成功,可以使用媒体服务获取摄像头的视频流。这通常涉及到获取...
这个项目,"android-onvif-master",旨在帮助开发者在Android平台上实现对ONVIF协议的支持,从而能够远程控制和管理符合该协议的摄像头设备。 首先,我们需要了解ONVIF协议的基本概念。ONVIF是一种国际开放型网络...
这个名为"AndroidXMPP-master"的项目显然是一个针对Android平台的XMPP客户端实现,包含了实现XMPP功能所需的全部源代码和资源。 在Android平台上开发XMPP应用,你需要理解以下几个核心知识点: 1. **XMPP协议**:...
在Android中,HttpClient库提供了与Web服务器进行HTTP通信的能力,支持各种HTTP方法(如GET、POST等),以及处理cookies、重定向、认证等功能。这个"HttpClient for android 4.3.5 jar"包含了两个文件:`httpclient-...
2. 认证与连接:使用HTTP或HTTPS与设备建立连接,进行身份验证,通常采用基本认证或digest认证。 3. 获取设备信息:调用Device服务的GetSystemDateAndTime、GetDeviceInformation等接口获取摄像头的基本信息。 4. ...
在Android平台上,安全性和数据保护是至关重要的,尤其是在处理用户敏感信息时。本文将深入探讨两种常见的加密算法:Base64和MD5,以及它们在Android开发中的应用。 首先,让我们了解一下Base64。Base64是一种编码...
让我们深入了解一下这些加密技术及其在Android中的实现。 首先,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它将任意长度的数据转化为固定长度的128位(16字节)的哈希值。MD5的主要用途是对数据...
Java Security 是 Java 平台中的一个重要组成部分,它不仅在软件实现方面有着丰富的内容,而且还涉及一系列规范。从 Java 2 开始,Java Security 主要包括以下几个重要的规范: 1. **Java Cryptography Extension ...
WebDAV工具类在Android应用中通常用于实现文件同步、上传和下载功能,尤其是在处理云存储或协同编辑场景时非常有用。以下是对"android webdav工具类"的详细解释: 1. **WebDAV基本概念**: WebDAV允许客户端不仅...
3. **身份认证**:ASMACK支持多种身份认证机制,如 Plain SASL、DIGEST-MD5 SASL等,这在源码中的`AbstractXMPPConnection`类中体现。不同的服务器可能要求不同的认证方式,ASMACK为此提供了灵活的支持。 4. **事件...
在Android平台上实现消息推送服务,通常会涉及到后台服务器与客户端应用之间的实时通信。在这个场景下,XMPP(Extensible Messaging and Presence Protocol)是一种常见的选择,它是一个基于XML的开放标准,用于即时...
在Android平台上实现Openfire的登录和注册功能,通常涉及到XMPP(Extensible Messaging and Presence Protocol)协议的使用,因为Openfire服务器就是基于XMPP的一种实时通信服务器。XMPP是一种开放的标准,用于即时...
在这个阶段,系统会利用MD5(Message-Digest Algorithm 5)加密算法生成一个终端令牌。MD5是一种广泛使用的哈希函数,能将任意长度的信息转化为固定长度的摘要,用于保证信息的完整性。 2. 终端登录模块:当设备...
okhttp-digest okhttp的摘要身份验证器。 大多数代码是从Apache Http Client移植的。重要的该工件已从jcenter转移到了Maven Central! 坐标已从com.burgstaller:okhttp-digest:<version>到io.github.rburgst:okhttp-...
在Android开发中,MD5可能被用于验证应用程序的下载完整性,保护用户数据的安全,或者在登录认证过程中作为密码的加密方式。 标签"Delphi"暗示这个压缩包可能与使用Delphi编程语言开发的Android应用或库有关。...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,可以将任意长度的信息映射为固定长度的输出,通常用于数据校验和安全认证。在这个"android代码获取签名MD5指纹demo"中,我们将深入探讨如何在Android...