Mozilla/Hawk 项目详解:HTTP认证方案的技术实现与安全实践
【免费下载链接】hawk HTTP Holder-Of-Key Authentication Scheme 项目地址: https://gitcode.com/gh_mirrors/hawk/hawk
概述
Mozilla/Hawk 是一个用于HTTP认证的方案,它通过部分加密验证请求和响应来确保通信安全。与传统的HTTP摘要认证类似,Hawk使用包含标识符(如用户名)和密钥(如密码)的客户端凭证,但密钥本身不会在请求中传输,而是用于计算请求MAC值。
核心设计目标
- 简化HTTP认证:为无法或不愿为所有资源部署TLS的服务提供简化的认证方案
- 凭证泄漏防护:防止动态配置场景下的凭证泄漏风险
- 恶意服务器防护:避免客户端在TLS握手时未验证服务器身份导致的凭证泄露
工作原理
基本流程
- 客户端和服务器预先共享对称密钥(需通过TLS等安全渠道建立)
- 客户端生成包含时间戳和随机数的请求
- 使用共享密钥计算请求MAC
- 服务器验证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支持可选的负载验证机制:
- 客户端计算负载哈希值并包含在请求头中
- 哈希计算包括:
- 固定前缀"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;
安全最佳实践
- 凭证传输安全:必须通过TLS等安全渠道交换Hawk凭证
- 请求机密性:Hawk不提供加密,敏感数据需额外保护
- 服务器验证:客户端应验证Server-Authorization头
- 凭证存储:密钥需明文存储,需加强服务器安全防护
- 时间同步:部署NTP服务确保时间同步
浏览器集成注意事项
在浏览器环境中使用时需注意:
- 确保服务器响应包含适当的CORS头:
Access-Control-Expose-Headers: WWW-Authenticate, Server-Authorization - 使用Webpack等工具打包Hawk库
- 注意浏览器环境下的时间同步限制
总结
Mozilla/Hawk提供了一种安全可靠的HTTP认证方案,特别适合无法全面部署TLS的环境。通过MAC验证、时间窗口和随机数机制,它在保证安全性的同时减少了服务器交互次数。开发者应结合自身安全需求,合理配置时间窗口、负载验证等参数,并遵循安全最佳实践来部署该方案。
【免费下载链接】hawk HTTP Holder-Of-Key Authentication Scheme 项目地址: https://gitcode.com/gh_mirrors/hawk/hawk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



