iOS中 Http 摘要(DIGEST)认证

参考自 
http://blog.csdn.net/hotnet522/article/details/5824716

HTTP请求报头: Authorization->
NSURL *strURL = [NSURL URLWithString:m_strAddress];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:strURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];
    if (theRequest == nil)
    {
        return NO;
    }
    
[theRequest setValue:author forHTTPHeaderField:@"Authorization"];//这里设置http请求报头,
author是已经组装好的认证信息,下面会说明。

HTTP响应报头: WWW-Authenticate->
    在- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response方法中可以取得该返回值。
    NSDictionary * pFieldd =[(NSHTTPURLResponse*)response allHeaderFields];
    NSString * strAuthenticate = [pFieldd valueForKey:@"Www-Authenticate"];


◆ 摘要认证 digest authentication    ← HTTP1.1提出的基本认证的替代方法
    服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。
    ※ 不包含密码的明文传递
    
     摘要认证步骤:
     1. 客户端访问一个受http摘要认证保护的资源。
     2. 服务器返回401状态以及nonce等信息,要求客户端进行认证。
HTTP/1.1 401 Unauthorized
WWW-Authenticate:Digest
realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
     3. 客户端将以用户名,密码,nonce值,HTTP方法, 和被请求的URI为校验值基础而加密(默认为 MD5算法)的摘要信息返回给服务器。
           认证必须的五个情报:
     ? realm : 响应中包含信息->由服务器返回
     ? nonce : 响应中包含信息->由服务器返回
     ? username : 用户名->
     ? digest-uri : 请求的URI->一般为全路径,具体要向服务器端设计人员询问。
     ? response : 以上面四个信息加上密码信息,使用MD5算法得出的字符串,这是由客户端计算的。
           如果客户端需要反过来对服务器端进行认证,还需要发送一个cnonce参数(个人认为应该就是在取得
response过程中产生的那个随机数~待验证)。
取得了全部信息后,向服务器端发送认证消息的格式如下(注意,所有的=,“”,/ 符号都要一一对应,不能多也不能少)
Digest username="Mufasa",// ← 客户端已知信息
realm="testrealm@host.com", //  ← 服务器端质询响应信息
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", // ← 服务器端质询响应信息
uri="/dir/index.html",// ← 客户端已知信息
qop=auth,  // ← 服务器端质询响应信息
nc=00000001,// ← 客户端计算出的信息
cnonce="0a4f113b",// ← 客户端计算出的客户端nonce
response="6629fae49393a05397450978507c4ef1", //← 最终的摘要信息 ha3
opaque="5ccc069c403ebaf9f0171e9517f40e41"  ← 服务器端质询响应信息
     4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。

     特记事项:
     1. 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。
     2. 当用户为某个realm首次设置密码时,服务器保存的是以用户名,realm,密码为基础计算出的哈希值(ha1),而非密码本身。
     3. 如果qop=auth-int,在计算ha2时,除了包括HTTP方法,URI路径外,还包括请求实体主体,从而防止PUT和POST请求表示被人篡改。
     4. 但是因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。

   ※ nonce:随机字符串,每次返回401响应的时候都会返回一个不同的nonce。 
   ※ nounce:随机字符串,每个请求都得到一个不同的nounce。 
      ※ MD5(Message Digest algorithm 5,信息摘要算法)
         ① 用户名:realm:密码 ? ha1
         ② HTTP方法:URI ? ha2
         ③ ha1:nonce:nc:cnonce:qop:ha2 ? ha3
   网上有开源的md5算法,依次实现这三步即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值