使用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条评论
登录后参与评论

相关文章

来自分类Dev

从javascript发送共享密钥以进行身份验证

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何使用密钥对连接的应用程序进行身份验证?Django,Python

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

TFVC的ssh密钥身份验证

来自分类Dev

基于SSH密钥的身份验证失败

来自分类Dev

Grape的API密钥身份验证

来自分类Dev

SSH密钥身份验证在错误的地方?

来自分类Dev

多个Spring项目,共享身份验证

来自分类Dev

与PHP共享Laravel身份验证/会话

来自分类Dev

与PHP共享Laravel身份验证/会话

来自分类Dev

域共享会话阻止身份验证

来自分类Dev

在身份服务器中使用cookie和令牌进行共享身份验证

来自分类Dev

使用AzCopy和共享访问密钥的Azure跨帐户复制

Related 相关文章

  1. 1

    从javascript发送共享密钥以进行身份验证

  2. 2

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

  3. 3

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

  4. 4

    如何使用密钥对连接的应用程序进行身份验证?Django,Python

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

    TFVC的ssh密钥身份验证

  21. 21

    基于SSH密钥的身份验证失败

  22. 22

    Grape的API密钥身份验证

  23. 23

    SSH密钥身份验证在错误的地方?

  24. 24

    多个Spring项目,共享身份验证

  25. 25

    与PHP共享Laravel身份验证/会话

  26. 26

    与PHP共享Laravel身份验证/会话

  27. 27

    域共享会话阻止身份验证

  28. 28

    在身份服务器中使用cookie和令牌进行共享身份验证

  29. 29

    使用AzCopy和共享访问密钥的Azure跨帐户复制

热门标签

归档