- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我国政府限制了 HTTPS 速度,以阻止访问伊朗境外的安全网络服务。现在我的客户因登录他们的帐户而感到痛苦。我知道当前帐户密码是使用 pbkdf2_sha256
算法进行加密和加盐的,并且有一些 javascript/jQuery 库可以消化 sha256 哈希值。
我的问题:是否有任何简单的方法(不需要重写/更改原始django.contrib.auth
)来使用AJAX请求发送的sha256哈希值作为登录密码?
更新:我计划在伊朗境内托管我的网站(伊朗的费用是伊朗的 5 倍,当然由政府控制),但至少 HTTPS 协议(protocol)不受限制。无论如何,通过 HTTP channel 以纯文本或摘要方式发送密码都是不安全的。虽然作为一名网络开发人员(而不是网络专家),我认为他们可以随时收集/嗅探哈希值/ session ID/cookie,但解决问题需要复杂的知识和努力,毕竟我的网站不需要这种级别的安全性。我们生活在不同的星球。
最佳答案
您可以编写自己的身份验证后端来使用原始密码:
from django.contrib.auth import backends
from django.contrib.auth.models import User
class RawPasswordUser(User):
class Meta:
proxy = True
def set_password(self, raw_password):
# default implementation made a hash from raw_password,
# we don't want this
self.password = raw_password
def check_password(self, raw_password):
# same here, don't make hash out of raw_password
return self.password == raw_password
class ModelBackend(backends.ModelBackend):
def authenticate(self, username=None, password=None):
try:
user = RawPasswordUser.objects.get(username=username)
if user.check_password(password):
return user
except RawPasswordUser.DoesNotExist:
return None
def get_user(self, user_id):
try:
return RawPasswordUser.objects.get(pk=user_id)
except RawPasswordUser.DoesNotExist:
return None
在设置文件中:
AUTHENTICATION_BACKENDS = (
# ModelBackend from project_root/auth/backends.py
'auth.backends.ModelBackend',
)
现在,当您在 View 中验证
用户时,您将获得RawPasswordUser
实例。这同样适用于 login_required
装饰器,request.user
将指向代理类。
参见documentation了解详情。
对于 Django 1.5+ there is also an option要将默认用户模型替换为自定义模型,但要保留现有用户,您必须以某种方式迁移它们,请参阅 this question .
<小时/>实际上,您无法保持用户密码不变。
默认情况下,Django 按以下格式存储密码:
algorithm$iterations$salt$hash
这意味着:
您不能仅根据原始密码的哈希值重新生成密码,因为您没有原始密码。
如果不知道盐,您也将无法在客户端生成相同的哈希值。您可以将其传递给客户端,但 salt 应该是一个 secret ,因此通过未加密的 channel 进行传递是不明智的。
我看到的最简单的解决方案是保持当前的 Django 行为,正如 Tadeck 所建议的那样。在评论中,在客户端添加哈希并强制用户更改密码。
嗯,这并不是一个真正的解决方案,因为攻击者可以拦截消化后的密码并直接使用它们,但您提到了您的问题更新。既然你不太关心安全性,你也可以查看 public key encryption在 JavaScript 中。
<小时/>Tadeck 提出的另一个解决方案是使用类似 OAuth 的服务,它可能看起来有点像这样:
def index(request):
access_token = request.REQUEST.get('token', None)
if not access_token:
return redirect('login')
# Custom authentication backend that accepts a token
# and searches for a user with that token in database.
user = authenticate(access_token)
if not user:
return redirect('login')
return render(...)
def auth(request):
''' This ajax-view has to be encrypted with SSL.'''
# Normal Django authentication.
user = authenticate(request.POST['username'], request.POST['password'])
# Authentication failed
if user is None:
return json.dumps({'error': '...'})
# generate, save and return token in json response
token = UserToken(user=user, value=generate_token())
# token.expires_at = datetime.now() + timedelta(days=1)
token.save()
return json.dumps({'token': token.value})
受到攻击的人仍然可以拦截访问 token ,但这比拦截密码哈希要好一些。
关于django - 让 Django 后端接受前端的 SHA256 而不是纯文本密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16339174/
可以抛出异常的函数可以有[pure]属性吗? 最佳答案 根据 https://msdn.microsoft.com/en-us/library/system.diagnostics.contracts
我使用的是纯 css 推送导航。它工作得很好,但是我不知道如何在单击导航链接时隐藏菜单。您必须手动单击菜单图标才能使菜单返回隐藏状态。但是,当单击链接并且站点跳转到某个部分时,我希望菜单自动滑入隐藏状
我正在尝试让纯 CSS 下拉菜单正常工作。它在很大程度上确实有效,除了其他内容似乎显示出来但我不知道为什么。 http://jsfiddle.net/uQveP/4/ 有人可以告诉我我做错了什么吗?
这个问题在这里已经有了答案: What is a "callback" in C and how are they implemented? (9 个回答) 关闭 8 年前。 我正在以这种方式实现回
我想在不使用 Javascript 或任何其他语言的情况下,使用 HTML 和 CSS 创建一个 Page Back Button。我想用纯 HTML 和 CSS 来完成。 我进行了搜索,但每次代码中
我对序言很陌生。据我所知,Pure Prolog 仅限于 Horn 子句。 这是一个非常简单的序言程序 - % student( Snr , FirstName , LastName ,
我想在加载数据时对容器使用以下加载指示器。 问题是, slider 具有固定的宽度和高度(300 像素和 300 像素),但我希望它能够动态适应容器。当我尝试添加宽度时:140px;和高度:140px
当内容超过可用宽度时,我需要启用滚动阴影。这是我试图用纯 css(没有 JS)来实现的。我遇到了很多文章,可以使用 css 多背景和背景附件来实现。如果内容是文本类型,则可以使用下面的 jsfilld
我正在编写一个上古卷轴在线插件,它由一个名为 Havok Script 的轻微修改的 Lua 5.1 引擎支持。 .这个Lua环境不允许访问os , io , package , debug模块或任何
我自己尝试过将 Arduino 库编译成他们自己的独立库并链接到 Eclipse 中的一个项目,但在此过程中遇到了一些问题。 是否有关于如何启动和运行的体面指南?我一直很难在网上找到一个真正有效的..
我在这里遇到了一些麻烦。我正在尝试使用本地存储创建一个待办事项列表,但我唯一要做的就是将列表项添加到本地存储并删除 所有项目 从本地存储中删除,但我无法从列表中删除单个 SELECTED 项目。有人可
我的问题很简单。考虑以下 CodePen .是否有可能仅使用 css 就可以获得相同的结果?换句话说,如果不使用 javascrip 如何做到这一点?非常感谢! Nachos are
我正在使用没有 jquery 的 angularjs,并尝试创建滚动事件监听器。 尝试过这种方法: $rootScope.$watch(function() { return $windo
我正在尝试使用纯 webgl 创建虚线。我知道这已经有一个问题,也许我很笨,但我不知道如何让它发挥作用。我理解这个概念,但我不知道如何在着色器中获取沿路径的距离。以前的答案有以下行: varying
我正在尝试用纯 JavaScript 制作工具提示,显示在 hover .就像 Stack Overflow 中将鼠标悬停在配置文件名称上的一个 div显示。 我尝试使用 onmouseover ,
我想要通过 AJAX 将监听器添加到新元素的想法: 例如,现在我有 hello world 我为每个 添加了一个监听器,但是当我通过 AJAX 加载新元素时,它没有监听器;我不完全确定问题是什么。
如果我错误地提出了这个问题,或者之前已经有人问过并回答过这个问题,我提前表示歉意。我的搜索发现了类似的基于 JQuery 和/或静态日期的问答,我正在寻找具有动态日期的纯 JavaScript 解决方
在 Real World Haskell, Chapter 28, Software transactional memory ,开发了一个并发的网络链接检查器。它获取网页中的所有链接,并使用 HEA
我正在尝试取消 jQuery-fy 一个聪明的 piece of code ,但有点太聪明了。 目标是simple 。将图像从桌面拖动到浏览器。 在这次 unjQueryfication 过程中,我发
如何重新创建 jQuery end() $('#id') .find('.class') .css('font',f) .end() .find('.seven') .css(b,'red') 我有什
我是一名优秀的程序员,十分优秀!