对于那些后来阅读此书的人:这是我正在做的一个业余项目的一部分,那时我还没有意识到这样的事情,那就叫我们加密吧!另外,我不想购买SSL证书;所以我试图在没有的情况下具有一些安全性https
。签名不能代替加密。如果您想做我想做的事,那就不要。从“让我们加密”获取证书。更简单,更安全!
我正在使用Django为移动应用程序实现Web服务。我决定使用Hash-MAC对请求进行身份验证(没有誓言,没有https),但是挑战是我应该使用什么作为共享密钥?
首先,我考虑使用“用户密码”,但是它要求将密码以纯文本格式存储在服务器端数据库中。我想到的另一个解决方案是在移动应用程序中添加密码并对其进行哈希处理,就像Django auth应用程序在客户端计算哈希密码的方式一样。
Django用作盐是什么?他们是“秘密”吗?将它们以纯文本格式发送给用户是否有问题?一般而言,我们不必将盐保留为“秘密”,但是Django可能会使用应作为盐保留秘密的内容,我不知道,这与Django如何实现此目的有关。
用户必须知道他们的盐来计算哈希密码,因此服务器应向他们提供密码。对手可以向所有用户索要盐,并且最终他可以索要所有盐(即使在特定时间段内有人可以提出请求的次数受到限制)。即使盐不是秘密,但我想知道它们全部都是危险的。(或者也许我过于担心安全性!)
请求格式:
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/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句