我可以让 HTTP Basic Auth 更安全吗?

问题描述 投票:0回答:1

我有一个 kubernetes 集群,其中包含一些应用程序、数据库等。所有这些 pod 都已经使用了 IAP,所以我不担心实际的漏洞。

对于一个应用程序,我只能选择老式的基本身份验证来验证内部用户。我以前从未(不得不)使用过这个,所以正在尝试想出改进这个方案的方法。

将散列密码客户端与整数时间戳一起进行散列(例如四舍五入到请求中最接近的秒数)会更安全吗?

因此,对于每个授权请求(或特定的 TTL/n.o 使用),客户端都会创建存储的散列 PW 加上最后 Unix 秒的新散列。

这被发送到服务器,服务器存储散列后的明文 PW。然后,服务器通过猜测来使用相同的时间戳对其进行散列(回溯到延迟 2 秒的时间)。如果匹配,则授予访问权限。

这比通过网络发送哈希更安全吗?至少,它的安全性并没有降低,对吗?

javascript authentication single-page-application
1个回答
0
投票

如果您能够操纵客户端和服务器处理,那么您实际上根本不必使用传统的用户名和密码,您可以在

Authorization
标头中编码您想要的任何内容,或者作为假的
 Authorization: Basic
字符串,或作为自定义
Authorization: Bearer
标记。

这意味着您不需要在服务器端进行任何猜测,您可以将额外的熵嵌入到请求本身中。一种常见的方法是包含时间戳和随机字符串(加密随机数)。

例如,客户端可能会生成以下内容(伪代码):

nonce = random.getPrintableString(20);
timestamp = time.now();
secret = config.get('shared_secret');
hash = hmac_sha256(username + '|' + nonce + '|' + timestamp + '|' + secret);
auth_header = 'Authorization: Bearer ' + username + '.' + nonce  + '.' + timestamp + '.' + hash;

服务器会这样验证:

token = request.headers['Authorization'].split(' ')[1];
[username, nonce, timestamp, hash] = token.split('.');

if ( time.now - timestamp > config.get('max_token_lifetime') ) {
    throw NotAuthed;
}

if ( recent_nonce_list.contains(nonce) ) {
    throw NotAuthed;
}
recent_nonce_list.push(nonce);

expectedHash = hmac_sha256(username + '|' + nonce + '|' + timestamp + '|' + secret);
if ( hash !== expectedHash ) {
    throw NotAuthed;
}

acceptLogin(username);

这并不能防止“篡改”请求,但它确实可以防止“重放”请求,因为如果攻击者试图重用来自(例如)的令牌,则随机数和/或时间戳将被拒绝。日志文件。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.