JavaScript Challenge-handshake认证django应用程序
项目描述
JavaScript Challenge-handshake认证django应用程序。
首先:Secure-JS-Login不是一个简单的“发送用户名 + PBKDF2-SHA(密码)”它更像是挑战-握手认证协议!
待办事项
修复示例项目中的“next_url”和所有链接
流程
保存新用户密码
客户端浏览器 / JavaScript部分
#. user input a password
init_pbkdf2_salt = SHA1(随机数据)
pbkdf2_hash = pbkdf2("Plain Password", salt=init_pbkdf2_salt)
客户端将 init_pbkdf2_salt 和 pbkdf2_hash 发送到服务器
服务器部分
服务器将 pbkdf2_hash 分割为: first_pbkdf2_part 和 second_pbkdf2_part
encrypted_part = xor_encrypt(first_pbkdf2_part, key=second_pbkdf2_part)
只保存 encrypted_part 和来自客户端的给定 init_pbkdf2_salt
登录 - 客户端浏览器 / JavaScript部分
使用请求登录
服务器发送带有随机 server_challenge 值的HTML登录表单
用户输入他的 username 和 password
Ajax请求服务器上的 init_pbkdf2_salt,带有给定的 username
生成认证数据
pbkdf2_temp_hash = pbkdf2("普通密码", init_pbkdf2_salt)
将 pbkdf2_temp_hash 分割成 first_pbkdf2_part 和 second_pbkdf2_part
cnonce = SHA1(随机数据)
pbkdf2_hash = pbkdf2(first_pbkdf2_part, salt=cnonce + server_challenge)
将 pbkdf2_hash、second_pbkdf2_part 和 cnonce 发送到服务器
服务器上的验证
客户端 POST 数据:pbkdf2_hash、second_pbkdf2_part 和 cnonce
从会话中获取传输的 server_challenge 值
通过给定的 username 从数据库中获取 encrypted_part 和 salt
first_pbkdf2_part = xor_decrypt(encrypted_part, key=second_pbkdf2_part)
test_hash = pbkdf2(first_pbkdf2_part, key=cnonce + server_challenge)
比较 test_hash 和传输的 pbkdf2_hash
安全吗?
与 https 相比,Secure-JS-Login 并非真正安全!例如,客户端无法验证自己是否真的与服务器通信,或者遭遇了 中间人攻击。
然而,所使用的程序比明文认证更安全。此外,服务器上不存储明文密码。存储在服务器上的数据不能单独使用。
如果您有 https,您可以将其与 Secure-JS-Login 结合使用,类似于将摘要认证与 https 结合。
更多信息: 为什么 Secure-JS-Login 有意义…(仅限德语,抱歉)
为什么?
许多,如果不是所有 CMS/wiki/forum,都使用了不安全的登录。用户名和密码以 明文 在互联网上发送。唯一可靠的解决方案是提供 https。
问题:没有提供商提供少量金钱即可使用的安全 HTTP 连接 :(
替代方案
摘要访问认证(在 django 中实现:django-digest)
优点
浏览器已实现它,因此不需要额外的 JavaScript
缺点
密码哈希必须在服务器上保存,没有任何盐!由于哈希可以用于登录,因此: hash = MD5(username:realm:password)
使用了旧的 MD5 哈希
尝试
例如。
~ $ virtualenv secure-js-login-env ~ $ cd secure-js-login-env ~/secure-js-login-env $ source bin/activate # install secure-js-login as "editable" to have access to example project server and unittests: (secure-js-login-env)~/secure-js-login-env $ pip install -e git+git://github.com/jedie/django-secure-js-login.git#egg=django-secure-js-login run example project server: {{{ (secure-js-login-env)~/secure-js-login-env $ cd src/django-secure-js-login/ (secure-js-login-env)~/secure-js-login-env/src/django-secure-js-login $ ./run_example_server.sh
运行 inittests
(secure-js-login-env)~/secure-js-login-env/src/django-secure-js-login $ ./runtests.py
要运行 Live-Server-Tests,安装 selenium 例如。
(secure-js-login-env)~/secure-js-login-env/src/django-secure-js-login $ pip install selenium (secure-js-login-env)~/secure-js-login-env/src/django-secure-js-login $ ./runtests.py
版本兼容性
secure-js-login |
Django |
Python |
---|---|---|
>=v0.1.0 |
v1.7, v1.8 |
v2.7, v3.4 |
(这些是单元测试变体。也许其他版本也兼容。)
变更日志
v0.2.0 - 10.05.2015
在 Raspberry Pi 1 上测试后增加默认 PBKDF2 迭代次数
更多单元测试
Honypot 登录引发“正常”表单错误
代码清理
文档更新
v0.1.0 - 06.05.2015
作为可重用应用程序的初始发布
使用 PBKDF2
03.05.2015:
从 PyLucid CMS ‘auth’ 插件 中拆分
03.2010:
11.07.2007:
新的 SHA 挑战响应程序(德语)
01.06.2005:
信息链接
Python-Forum 线程(德语)
摘要认证作为替代方案? (03.2010)
PyLucid Secure-JS-Login 的意义或无意义… (12.2006)
如何防止会话劫持? (12.2006)
在 de.comp.lang.python 上的讨论 (08.2006)
项目链接
Github |
|
Python 软件包 |
|
Travis CI |
使用的 JavaScript 实现
SHA1 - Secure Hash Algorithm,SHA-1 的 JavaScript 实现,如 FIPS 180-1 中定义
由 Paul Johnston 实现
在BSD许可证下分发
PBKDF2 - 根据 RFC 2898 定义的基于密码的密钥派生函数 2 的 JavaScript 实现
由 Parvez Anandam 实现
在BSD许可证下分发
联系方式
加入对话,除了github的通信功能外
IRC |
#pylucid 在 freenode.net (是的,PyLucid 频道…) |
网络聊天 |
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
构建分布
django-secure-js-login-0.2.0.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 689cf5343b824f63c1e78b61283c578cbcedce6e0b7e3e4477146ff719878634 |
|
MD5 | 00d441c179d68f41616c1491ce812adc |
|
BLAKE2b-256 | d6c61289f2cd02645c70155152b86126d36cff05b1311e54579d9c97354e623d |
django_secure_js_login-0.2.0-py2.py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 09c44c80bc01edbd73346b7bee8b9780a20a0c9f80fa708f46903c785394f9cc |
|
MD5 | 04d0d7cbb0c115ea10ca6168eab97e9d |
|
BLAKE2b-256 | 7134e0ec3ec53c83a148cb71cf48da19dd711841b53e09d9139a99ee33542261 |