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

时间:2015-05-22 20:44:22

标签: python django authentication hmac

我正在使用Django为移动应用实现一项Web服务。我决定使用Hash-MAC来验证请求(没有Oath,没有https),但挑战是我应该使用什么作为共享密钥?

首先,我考虑使用用户的密码,但需要在服务器端数据库中以明文形式存储密码。我想到的另一个解决方案是在移动应用程序中使用django auth app进行密码和散列密码,以便在客户端计算散列密码。

  1. Django用什么盐作为盐?他们是秘密"?将它们作为纯文本发送给用户是否有任何问题?我们不必将盐保存为一般的秘密,但是Django可能会使用一些应该保密的东西作为盐,我不知道,它是关于django如何实施的此

  2. 用户必须知道他们的盐才能计算散列密码,因此服务器应该为他们提供密码。对手可以要求所有用户使用盐,并且最终他可以获得所有盐(即使某个时间段内有人可以要求这种盐的次数有限)。虽然盐不是秘密但我想知道"所有"他们可能是危险的。 (或者我可能过分担心安全问题!)

  3. 请求格式:

    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')
    

1 个答案:

答案 0 :(得分:1)

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

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

Django使用随机函数生成其secret_key。 Linux上的随机函数将调用/ dev / urandom,在windows上将调用与之相当的东西。

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

如果要计算自定义哈希值,可以调用make_password函数,并将其直接保存在用户

中的密码属性中

阅读本文:https://docs.djangoproject.com/en/1.8/topics/auth/passwords/

示例:Django make_password too slow for creating large list of users programatically

相关问题