Проверка пароля с ошибками в символах £ или $ с использованием passlib - PullRequest
0 голосов
/ 01 июня 2018

Я использую passlib == 1.7.1 со следующим импортом:

from passlib.apps import custom_app_context as pwd_context

Затем хэшируем пароль со следующим:

pwd_context.encrypt(password)

Затем я проверяю с помощью:

pwd_context.verify(password, self.password_hash)

Это нормально, но с определенными символами проверка не выполняется.например, «£» или «$».

Кто-нибудь знает, почему это так, пожалуйста?

Спасибо!


Обновление:

Спасибо всем большое.Вооружившись этой информацией, я исследовал немного больше, и кажется, что проблема не в passlib, а где-то между angular4, где я отправляю заголовок авторизации base64 в приложение фляги.

В настоящее время я использую следующее, чтобы сделать это:

let headers: Headers = new Headers({
        'Content-Type': 'application/json',
        'Authorization': 'Basic ' + btoa(userLoginRequest.username + ':' + userLoginRequest.password)
    });

Сегодня я много читал об unescape (и это обесценивает в пользу decodeURI ()).Я также много читал о поддержке юникода в кодировке base64.Я попробовал несколько комбинаций этих вещей, и это не имело никакого значения.Теперь я действительно очень запутался!

Чтобы проверить, что происходит, я делаю следующее.В angular4 я выполняю следующее:

let encodedString = btoa('doug:Tree£9')
console.log(encodedString)
console.log(atob(encodedString))

Как и ожидалось, на консоли выводится следующее.

ZG91ZzpUcmVlozk=
doug:Tree£9

Так что кодирование и декодирование совершенно нормально.

Выполнение того же процесса в Python ...

import base64
encoded = base64.b64encode('doug:Tree£9')
print encoded
print base64.b64decode(encoded)

В терминале я получаю следующее.

ZG91ZzpUcmVlwqM5
doug:Tree£9

Замечу, что "ZG91ZzpUcmVlozk =" и "ZG91ZzpUcmVlwqM5" не совпадают.Тем не менее, оба метода работают на своих собственных языках.

Если я помещаю кодированную строку "ZG91ZzpUcmVlozk =" из javascript в python и декодирую ее следующим образом ...

import base64
print base64.b64decode("ZG91ZzpUcmVlozk=")

Я получаю:

doug:Tree�9

Обратите внимание, что символ £ теперь разбит.

Другие символы Unicode тоже не работают.

Так что я думаю, что вопрос в том, как мне кодировать авторизациюзаголовок, чтобы python правильно распознал символ £, а какие-либо другие символы, которые пользователи выбирают для своих паролей?

Большое спасибо!


Редактировать: Решено!

Iнашел это Использование atob Javascript для декодирования base64 некорректно декодирует строки utf-8 , что связано с некоторыми подробностями.Я решил это, используя следующий подход, рекомендованный @ brandonscript.

b64EncodeUnicode(str) : string{
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode(parseInt(p1, 16))
    }))
}

Работает отлично!Уф!

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
# -*- coding: utf-8 -*-
from passlib.apps import custom_app_context as pwd_contex

password='£$'

encrypted=pwd_contex.encrypt(password)

print(pwd_contex.verify('£$', encrypted))
print(pwd_contex.verify('john', encrypted))

True
False

отлично работает на моей системе.Возможно, вам нужно установить кодировку по умолчанию # -*- coding: utf-8 -*- в верхней части скрипта

0 голосов
/ 01 июня 2018

Я предполагаю, что вы столкнулись с проблемой кодировки из документации:

http://passlib.readthedocs.io/en/stable/narr/hash-tutorial.html#hashing

Используйте PasswordHash.hash () для хэширования пароля.Этот вызов заботится о кодировке Unicode ....

from passlib.hash import pbkdf2_sha256

hash = pbkdf2_sha256.hash("$password")
pbkdf2_sha256.verify("$password", hash)
# True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...