tl; - W jaki sposób używać biblioteki Python-side, takiej jak PassLib, do mieszania haseł przed wstawieniem ich do MySQL DB z SQLAlchemy?SQLAlchemy & PassLib
porządku, więc już zostały pokoju moją głowę na moim biurku na dzień lub dwa próbuje dowiedzieć się tego, więc o to idzie:
Piszę aplikacji internetowych przy użyciu Pyramid i/SQLAlchemy Próbuję połączyć się z moją tabelą Użytkownicy bazy MySQL.
Docelowo chcę zrobić coś jak następuje:
Porównaj hasło hash:
if user1.password == 'supersecret'
Włóż nowe hasło:
user2.password = 'supersecret'
chciałbym aby móc używać PassLib do mieszania moich haseł zanim przejdą do bazy danych i nie jestem fanem używania wbudowanej funkcji SHA2 MySQL, ponieważ nie jest ona solona.
Jednak, żeby spróbować, mam tej pracy przy użyciu funkcji SQL-side:
from sqlalchemy import func, TypeDecorator, type_coerce
from sqlalchemy.dialects.mysql import CHAR, VARCHAR, INTEGER
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
class SHA2Password(TypeDecorator):
"""Applies the SHA2 function to incoming passwords."""
impl = CHAR(64)
def bind_expression(self, bindvalue):
return func.sha2(bindvalue, 256)
class comparator_factory(CHAR.comparator_factory):
def __eq__(self, other):
local_pw = type_coerce(self.expr, CHAR)
return local_pw == func.sha2(other, 256)
class User(Base):
__tablename__ = 'Users'
_id = Column('userID', INTEGER(unsigned=True), primary_key=True)
username = Column(VARCHAR(length=64))
password = Column(SHA2Password(length=64))
def __init__(self, username, password):
self.username = username
self.password = password
ten został skopiowany z przykładu 2 w http://www.sqlalchemy.org/trac/wiki/UsageRecipes/DatabaseCrypt
tak, że działa i pozwala mi korzystaj z wbudowanej funkcji SHA2 MySQL (dzwoniąc pod numer func.sha2()
) i rób dokładnie to, co chcę. Jednak teraz próbuję zastąpić to przy pomocy PassLib po stronie Pythona.
PassLib prezentuje dwie funkcje: jeden na utworzenie nowego hasła hash, a jeden do zweryfikowania hasło:
from passlib.hash import sha256_crypt
new_password = sha256_crypt.encrypt("supersecret")
sha256_crypt.verify("supersecret", new_password)
nie mogę dość dowiedzieć się, jak zaimplementować to w rzeczywistości. Po przeczytaniu całej dokumentacji uważam, że jest to albo inna forma TypeDecorator, deklaracja typu niestandardowego, wartość hybrydowa, albo właściwość hybrydowa. Próbowałem podążać za this, ale to naprawdę nie ma dla mnie sensu, ani też sugerowany tam kod faktycznie nie działa.
Podsumowując moje pytanie - w jaki sposób mogę przeciążać operatorów =
i ==
, aby uruchamiać operacje w odpowiednich funkcjach skrótu?
Dzięki! To jest nowe, ponieważ zadałem to pytanie, ale jest dokładnie tym, czego szukałem w tym czasie! – kc9jud
Co powiesz na dodanie kolumny soli do tego modelu? Czy istnieje sposób na użycie soli z sqlalchemy-utils i przechowywanie? – steve