使用Django的HMAC身份验证-共享密钥

穆罕默德(Mohammad Jafar Mashhadi)

对于那些后来阅读此书的人:这是我正在做的一个业余项目的一部分,那时我还没有意识到这样的事情,那就叫我们加密吧!另外,我不想购买SSL证书;所以我试图在没有的情况下具有一些安全性https签名不能代替加密。如果您想做我想做的事,那就不要。从“让我们加密”获取证书。更简单,更安全!


我正在使用Django为移动应用程序实现Web服务。我决定使用Hash-MAC对请求进行身份验证(没有誓言,没有https),但是挑战是我应该使用什么作为共享密钥?

首先,我考虑使用“用户密码”,但是它要求将密码以纯文本格式存储在服务器端数据库中。我想到的另一个解决方案是在移动应用程序中添加密码并对其进行哈希处理,就像Django auth应用程序在客户端计算哈希密码的方式一样。

  1. Django用作盐是什么?他们是“秘密”吗?将它们以纯文本格式发送给用户是否有问题?通常,我们不必将盐保留为“秘密”,但是Django可能会使用一些应作为盐保密的东西,我不知道,这与Django如何实现此目的有关。

  2. 用户必须知道他们的盐来计算哈希密码,因此服务器应向他们提供密码。对手可以向所有用户索要盐,最终,他可以索要所有盐(即使在特定时间段内有人可以要求的次数有限制)。即使盐不是秘密,但我想知道它们全部都是危险的。(或者也许我过于担心安全性!)

请求格式:

HTTP request header:
x-mac-digest: 1d186b9c0fd5cd393f23623f0d167f7b17ac7d1cd74d8442647991d61e756c19

HTTP request body:
{
  "username": "mjafar",
  ... rest of request in json
}

身份验证请求(简化​​):

hash_digest = request.META['HTTP_X_MAC_DIGEST']
request_body = request.body.decode('utf-8')
request_json = json.loads(request_body)

user = UserModel.objects.get(username=request_json['username'])
sharedKey = getSharedKey(user)  # What should it return?

hash = hmac.new(sharedKey, request_body, hashlib.sha256).hexdigest()
if hash != hash_digest:
    return HttpResponseBadRequest('MAC authentication failed')
艾哈迈德

HMAC用于验证消息块。它用于验证密码/文​​本块在传输过程中是否未更改。您将需要使用非对称加密(RSA,DH等)来传输您的共享密钥。

使用纯文本而不使用数字签名是没有用的。您将容易受到MITM攻击。除非您设法将共享机密放在没有互联网的移动应用程序上(GSM SIM卡在SIM卡本身内部就有共享密钥,并且用于加密GSM呼叫)。

Django使用随机函数生成其secret_key。在Linux上,随机函数将调用/ dev / urandom,在Windows上将调用与之等效的函数。

在您的情况下,请创建一个rest api以创建用户名和密码,然后返回一个哈希值以用于访问您的视图。

如果要计算自定义哈希值,则可以调用make_password函数,并将其直接保存在User的password属性中

请阅读以下内容:https : //docs.djangoproject.com/en/1.8/topics/auth/passwords/

示例:Django make_password太慢,无法以编程方式创建大量用户

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

共享/ home和OpenLDAP的SSH密钥身份验证失败

如何通过命令行使用 hmac 密钥对存储桶进行身份验证

使用公共/专用密钥而不是共享机密的IdentityServer客户端身份验证

Azure 存储队列通过 REST API c# 使用共享密钥身份验证

如何在Windows 10上使用基于密钥的身份验证共享文件夹?

与Keepass + Putty一起使用SSH密钥身份验证时的sudo身份验证

多个Django应用程序,共享身份验证

跨多个 Django 站点共享身份验证

使用密钥环自动使用 wget 进行身份验证

使用椭圆JS库从公共密钥生成共享密钥

使用API密钥对Google Directory进行身份验证

使用密钥的扭曲的ssh服务器身份验证

Git 未使用正确的 SSH 密钥进行身份验证

使用API密钥策略的Lumen API身份验证

Ansible身份验证,使用带有密码短语的密钥

使用密钥子集进行身份验证/解密

SSH不使用公共密钥进行身份验证(Windows)

使用 python 在 Elasticsearch 中进行 API 密钥身份验证

Sendgrid使用API密钥进行身份验证

使用Terraform阻止允许共享访问密钥

使用 python 进行共享点身份验证

Windows Server 2016 AD FS 4.0 使用 OAUTH JWT 和共享密钥对外部 Web 应用程序进行身份验证

为什么要在SSH中进行身份验证之前产生一个共享的会话密钥?

使用Windows密钥存储区中存储的密钥作为OpenSSL中的预共享密钥

TFVC的ssh密钥身份验证

密钥库身份验证(REST API)

Grape的API密钥身份验证

HTTP基本身份验证与密钥

无法下载APNs身份验证密钥