Найти - Пользователи
Полная версия: TG+SA: помогите разобраться с md5 password encryption, пожалста
Начало » Pyramid / Pylons / TurboGears » TG+SA: помогите разобраться с md5 password encryption, пожалста
1
hildi
Сабж.

Включила мд5 шифрование тут:

app.cfg
identity.saprovider.encryption_algorithm='md5'
Включила шифрование при создании нового юзера:

    @expose(template="cmts.templates.adduser")
@identity.require(identity.in_group("admin"))
def saveuser(self, **kw):
# .... blabla

if kw['password'] != "":
user.password = identity.current_provider.encrypt_password (kw['password'])
else:
session.close()
return dict(adduser_widget = adduser_widget, message=" Empty password field!")
session.commit()
В результате пароли пишутся в базу в зашифрованном виде, но залогиниться с обыкновенным, незашифрованным паролем нельзя - пишет:
2009-10-21 13:47:19,239 turbogears.identity.saprovider INFO Passwords don't match for user: admi
2009-10-21 13:47:19,239 turbogears.identity WARNING The credentials specified weren't valid

Понять можно :-) Если рассуждать логически, то при логине clear text password должен зашифровываться, чтобы совпасть с тем, что хранится в базе в зашифрованном виде (хотя если тупо скопировать зашифрованный пароль типа “ce365c0b37f3ea94bce7995ff4420c25” из базы, то с ним тоже залогиниться не получается)

Короче, я застряла.

То, что в ниже описанном классе указано - это недостаточно, видимо.
model.py
class User(object):

def permissions(self):
p = set()
for g in self.groups:
p |= set(g.permissions)
return p
permissions = property(permissions)

def by_email_address(cls, email):
return cls.query.filter_by(email_address=email).first()
by_email_address = classmethod(by_email_address)

def by_user_name(cls, username):
return cls.query.filter_by(user_name=username).first()
by_user_name = classmethod(by_user_name)

def _set_password(self, password):
self._password = identity.encrypt_password(password) #<--- вот тут

def _get_password(self):
return self._password

password = property(_get_password, _set_password)
Читала вот тут: http://docs.turbogears.org/1.0/RoughDocs/IdentityEncryptedPassword?highlight=(password)|(encryption) и еще разные доки на docs.turbogears.org и nabble, но ничего подходящего не нашла :-(
PooH
Меня терзают смутные подозрения, что у вас пароли шифруются дважды. Попробуйте в saveuser убрать шифрование(encrypt_password) и создать пользователя.
hildi
Тогда в базу пишется юзер с clear text паролем.
coбсно, saveuser - это единственное место, где шифрование явно указывается, больше нигде, и как раз это меня и настораживает.
PooH
hildi
Тогда в базу пишется юзер с clear text паролем.
coбсно, saveuser - это единственное место, где шифрование явно указывается, больше нигде, и как раз это меня и настораживает.
Как единственное? В saveuser
user.password = identity.current_provider.encrypt_password (kw['password'])
При этом вызывается метод _set_password класса User, а в нем
self._password = identity.encrypt_password(password)
Или я чего-то не понимаю, или одно из двух.
hildi
Видимо, этот метод self._password = identity.encrypt_password(password) ничего не шифрует, в нем же конкретный провайдер не указан.
Ну и в базу-то пишется clear text, значит, действительно шифрования не происходит.

Я бы сама очень хотела понять.
PooH
Сегодня уже поздно, завтра на работе посмотрю исходники
hildi
Спасибо огромное! :-)
PooH
Попробовал на старом проекте включить md5 encryption:
в app.cfg указал
identity.saprovider.encryption_algorithm='md5'

там же проверил что указаны мои классы пользователей:
identity.saprovider.model.user=“rieltiko.model.User”
identity.saprovider.model.group=“rieltiko.model.Group”
identity.saprovider.model.permission=“rieltiko.model.Permission”

запустил, все работает, пароли в базе шифрованные. больше никаких телодвижений не понадобилось.
уберите шифрование из метода saveuser, в _set_password в строчке:
self._password = identity.encrypt_password(password)
берется алгоритм указанный в конфиге.
pooh@pooh$ tg-admin shell
In [1]: from rieltiko.model import *
In [2]: s = User()
In [2]: s.password = '123'
Loading: rieltiko.model.VisitIdentity
In [3]: s.password
Out[3]: u'202cb962ac59075b964b07152d234b70'
hildi
Блин, как все просто! А я еще удивлялась, почему в сети практически никакой инфы про шифрование нет: потому что она нафиг не нужна, оказывается!
Черт, у меня же сначала все правильно было.
Основная проблема была в ДНК, в смысле, что при редактировании app.cfg ТГ не перезапускал приложение автоматически и изменения не вступали в силу, а я это не заметила за редактированием других модулей - ведь если контроллер или там модель отредактировать, то приложение перезапускалось само, а если только апп.кфг - то нет.
Тьфу.

Огромное нечеловеческое спасибо за терпение!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB