Mozilla/Hawk 项目详解:HTTP认证方案的技术实现与安全实践

Mozilla/Hawk 项目详解:HTTP认证方案的技术实现与安全实践

【免费下载链接】hawk HTTP Holder-Of-Key Authentication Scheme 【免费下载链接】hawk 项目地址: https://gitcode.com/gh_mirrors/hawk/hawk

概述

Mozilla/Hawk 是一个用于HTTP认证的方案,它通过部分加密验证请求和响应来确保通信安全。与传统的HTTP摘要认证类似,Hawk使用包含标识符(如用户名)和密钥(如密码)的客户端凭证,但密钥本身不会在请求中传输,而是用于计算请求MAC值。

核心设计目标

  1. 简化HTTP认证:为无法或不愿为所有资源部署TLS的服务提供简化的认证方案
  2. 凭证泄漏防护:防止动态配置场景下的凭证泄漏风险
  3. 恶意服务器防护:避免客户端在TLS握手时未验证服务器身份导致的凭证泄露

工作原理

基本流程

  1. 客户端和服务器预先共享对称密钥(需通过TLS等安全渠道建立)
  2. 客户端生成包含时间戳和随机数的请求
  3. 使用共享密钥计算请求MAC
  4. 服务器验证MAC和时间有效性

重放攻击防护

Hawk通过以下机制防止重放攻击:

  • 客户端生成随机数:每个时间戳和密钥标识符组合下的请求使用唯一随机数
  • 时间窗口限制:默认1分钟的时间窗口(实际允许±1分钟的时间偏差)
  • 时钟同步:建议使用NTP同步,但客户端仅计算与特定服务器的时间偏移量

代码实现示例

服务器端实现

const Http = require('http');
const Hawk = require('hawk');

// 凭证查询函数
const credentialsFunc = (id) => ({
    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
    algorithm: 'sha256',
    user: 'Steve'
});

// 创建HTTP服务器
const handler = async (req, res) => {
    let payload, status;
    
    try {
        const { credentials, artifacts } = await Hawk.server.authenticate(req, credentialsFunc);
        payload = `Hello ${credentials.user} ${artifacts.ext}`;
        status = 200;
        
        // 生成Server-Authorization响应头
        const headers = { 'Content-Type': 'text/plain' };
        headers['Server-Authorization'] = Hawk.server.header(credentials, artifacts, { 
            payload, 
            contentType: headers['Content-Type'] 
        });
        
        res.writeHead(status, headers);
    } catch (error) {
        res.writeHead(401, { 'Content-Type': 'text/plain' });
        payload = 'Shoosh!';
    }
    
    res.end(payload);
};

Http.createServer(handler).listen(8000, 'example.com');

客户端实现

const Request = require('request');
const Hawk = require('hawk');

// 客户端凭证
const credentials = {
    id: 'dh37fgj492je',
    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
    algorithm: 'sha256'
}

// 生成认证头
const { header } = Hawk.client.header(
    'http://example.com:8000/resource/1?b=1&a=2', 
    'GET', 
    { credentials, ext: 'some-app-data' }
);

// 发送认证请求
Request({
    uri: 'http://example.com:8000/resource/1?b=1&a=2',
    method: 'GET',
    headers: { Authorization: header }
}, (error, response, body) => {
    // 验证服务器响应
    const isValid = Hawk.client.authenticate(response, credentials, header.artifacts, { payload: body });
    console.log(`${response.statusCode}: ${body}` + (isValid ? ' (valid)' : ' (invalid)`));
});

高级特性

负载验证

Hawk支持可选的负载验证机制:

  1. 客户端计算负载哈希值并包含在请求头中
  2. 哈希计算包括:
    • 固定前缀"hawk.1.payload"
    • 小写的content-type(不含参数)
    • UTF-8编码的原始负载
// 负载哈希计算示例
const crypto = require('crypto');

const payload = "Thank you for flying Hawk";
const contentType = "text/plain";
const input = `hawk.1.payload\n${contentType}\n${payload}\n`;
const hash = crypto.createHash('sha256').update(input).digest('base64');

临时访问授权(Bewit)

Hawk提供Bewit机制,允许短期访问受保护资源:

  • 仅限GET请求
  • 有限的有效期
  • 通过URI查询参数传递
// 生成Bewit
const bewit = Hawk.uri.getBewit('http://example.com:8000/resource/1', {
    credentials: credentials,
    ttlSec: 300,  // 5分钟有效期
    ext: 'temp-access'
});

// 构造访问URI
const uri = 'http://example.com:8000/resource/1?bewit=' + bewit;

安全最佳实践

  1. 凭证传输安全:必须通过TLS等安全渠道交换Hawk凭证
  2. 请求机密性:Hawk不提供加密,敏感数据需额外保护
  3. 服务器验证:客户端应验证Server-Authorization头
  4. 凭证存储:密钥需明文存储,需加强服务器安全防护
  5. 时间同步:部署NTP服务确保时间同步

浏览器集成注意事项

在浏览器环境中使用时需注意:

  1. 确保服务器响应包含适当的CORS头:
    Access-Control-Expose-Headers: WWW-Authenticate, Server-Authorization
    
  2. 使用Webpack等工具打包Hawk库
  3. 注意浏览器环境下的时间同步限制

总结

Mozilla/Hawk提供了一种安全可靠的HTTP认证方案,特别适合无法全面部署TLS的环境。通过MAC验证、时间窗口和随机数机制,它在保证安全性的同时减少了服务器交互次数。开发者应结合自身安全需求,合理配置时间窗口、负载验证等参数,并遵循安全最佳实践来部署该方案。

【免费下载链接】hawk HTTP Holder-Of-Key Authentication Scheme 【免费下载链接】hawk 项目地址: https://gitcode.com/gh_mirrors/hawk/hawk

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值