Конвертировать хэш проверки Python 2 в Python 3

Websockets и SSE (события, отправленные сервером) способны одновременно передавать данные в браузеры, однако они не являются конкурирующими технологиями.

Соединения веб-соединений могут как отправлять данные в браузер, так и получать данные из браузера. Хорошим примером приложения, которое может использовать websockets, является приложение для чата.

Соединения SSE могут только передавать данные в браузер. Онлайн-котировки акций или твиттеры, обновляющие временную шкалу или фид, являются хорошими примерами приложения, которое может извлечь выгоду из SSE.

На практике, поскольку все, что можно сделать с помощью SSE, также можно выполнять с помощью Websockets, Websockets получает больше внимания и любви, а многие другие браузеры поддерживают веб-узлы, чем SSE.

Однако это может быть излишним для некоторых типов приложений, а бэкэнд может быть проще реализовать с помощью протокола, такого как SSE.

Кроме того, SSE может быть заполнен в старых браузерах, которые не поддерживают его, используя только JavaScript. Некоторые реализации SSF-полиполков можно найти на странице gg-файла Modernizr .

Gotchas:

  • SSE имеет ограничение на максимальное число открытые соединения, которые могут быть особенно болезненными при открытии различных вкладок, поскольку предел равен на каждого браузера и установлен на очень низкое число (6). Проблема была отмечена как «Не исправлена» в Chrome и Firefox
  • Только WS может передавать как двоичные данные, так и UTF-8, SSE ограничивается UTF-8. (Спасибо Chado Nihi).

HTML5Rocks имеет некоторую хорошую информацию об SSE. С этой страницы:

События с сервером и веб-узлами

Почему вы выбрали события, переданные сервером через WebSockets? Хороший вопрос.

Одна из причин, по которой SSE хранились в тени, потому что более поздние API, такие как WebSockets, обеспечивают более богатый протокол для выполнения двунаправленной полнодуплексной связи. Наличие двухканального канала более привлекательно для таких вещей, как игры, приложения для обмена сообщениями и для случаев, когда вам нужны почти обновления в реальном времени в обоих направлениях. Однако в некоторых сценариях данные не нужно отправлять с клиента. Вам просто нужны обновления из какого-либо действия сервера. Несколько примеров - это обновления статуса друзей, биржевые тикеры, новостные ленты или другие автоматизированные механизмы передачи данных (например, обновление клиентской базы данных веб-SQL или хранилища объектов IndexedDB). Если вам нужно отправить данные на сервер, XMLHttpRequest всегда является другом.

SSE отправляются по традиционному HTTP. Это означает, что для работы не требуется специальный протокол или реализация сервера. WebSockets, с другой стороны, требуют полнодуплексных соединений и новых серверов Socket Socket для обработки протокола. Кроме того, Server-Sent Events имеют множество функций, которые не имеют WebSockets, такие как автоматическое повторное подключение, идентификаторы событий и возможность отправлять произвольные события.

blockquote>

Резюме TLDR:

Преимущества SSE над веб-сокетами:

  • Транспортировано по простому HTTP вместо пользовательского протокола
  • Может быть заполнено с помощью javascript на «backport» SSE для браузеров, которые еще не поддерживают его.
  • Встроенная поддержка повторного подключения и идентификатора события
  • Упрощенный протокол

Преимущества Веб-разъемы над SSE:

  • Реальное время, двухстороннее сообщение.
  • Встроенная поддержка в других браузерах

Идеальные варианты использования SSE:

  • Поток потокового тикера
  • обновление твиттера
  • Уведомления в браузере

SSE gotchas:

  • Нет двоичной поддержки
  • Максимальное ограничение открытых подключений

3
задан Roman 21 January 2019 в 08:22
поделиться

1 ответ

Я думаю, у меня получилось. Я нашел оригинальный код на github , который помог мне создать контрольный пример. Посмотрев на проблемы, я последовал решению, которое вы придумали, и расшифровал байты в iso-8859-1 вместо utf-8, и это сработало.

from struct import Struct
from base64 import b64decode
import hashlib
import hmac
from operator import xor
from itertools import starmap


_pack_int = Struct('>I').pack


def check_hash(password, hash_):
    """Check a password against an existing hash."""
    if isinstance(password, str):
        password = password.encode('utf-8')
    algorithm, hash_function, cost_factor, salt, hash_a = hash_.split(' 

Вместо того, чтобы продолжать настраивать этот скрипт и поддерживать его, я бы посоветовал взглянуть на реализации этой же функции в python3.

Ссылки

) assert algorithm == 'PBKDF2' hash_a = b64decode(hash_a).decode('iso-8859-1') hash_b = pbkdf2_bin(password, salt, int(cost_factor), len(hash_a), getattr(hashlib, hash_function)) assert len(hash_a) == len(hash_b) # we requested this from pbkdf2_bin() # Same as "return hash_a == hash_b" but takes a constant time. # See http://carlos.bueno.org/2011/10/timing.html diff = 0 for char_a, char_b in zip(hash_a, hash_b): diff |= ord(char_a) ^ ord(char_b) return diff == 0 def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None): """Returns a binary digest for the PBKDF2 hash algorithm of `data` with the given `salt`. It iterates `iterations` time and produces a key of `keylen` bytes. By default SHA-1 is used as hash function, a different hashlib `hashfunc` can be provided. """ hashfunc = hashfunc or hashlib.sha1 mac = hmac.new(data, None, hashfunc) def _pseudorandom(x, mac=mac): h = mac.copy() h.update(x) return list(map(ord, h.digest().decode('iso-8859-1'))) buf = [] for block in range(1, -(-keylen // mac.digest_size) + 1): myx = salt.encode('utf-8') + _pack_int(block) rv = u = _pseudorandom(myx) for i in range(iterations - 1): u = _pseudorandom(''.join(map(chr, u)).encode('iso-8859-1')) rv = starmap(xor, zip(rv, u)) buf.extend(rv) return ''.join(map(chr, buf))[:keylen] if __name__ == "__main__": print(check_hash('Xs12\'io!12', 'PBKDF2$sha256$10000$r+Gy8ewTkE7Qv0V7$uqmgaPgpaT1RSvFPMcGb6cGaFAhjyxE9'))

Вместо того, чтобы продолжать настраивать этот скрипт и поддерживать его, я бы посоветовал взглянуть на реализации этой же функции в python3.

Ссылки

0
ответ дан SomeGuyOnAComputer 21 January 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: