from django.contrib.auth.hashers import BasePasswordHasher, mask_hash
from django.utils.datastructures import SortedDict
from django.utils.crypto import constant_time_compare
from django.utils.translation import ugettext_noop as _
class MySQLOldPasswordHasher(BasePasswordHasher):
"""
Classe para criptografar as senhas utilizando o modelo da funcao old_password do mysql 4.x
Class to encrypt the passwords using the model of mysql 4.x old_password function
"""
algorithm = "mysql_old_password"
def salt(self):
return ''
def encode(self, password, salt):
nr = 1345345333
add = 7
nr2 = 0x12345671
for c in (ord(x) for x in password if x not in (' ', '\t')):
nr^= (((nr & 63)+add)*c)+ (nr << 8) & 0xFFFFFFFF
nr2= (nr2 + ((nr2 << 8) ^ nr)) & 0xFFFFFFFF
add= (add + c) & 0xFFFFFFFF
password = "%08x%08x" % (nr & 0x7FFFFFFF,nr2 & 0x7FFFFFFF)
return "%s$%s" % (self.algorithm, password)
def verify(self, password, encoded):
encoded_2 = self.encode(password, '')
return constant_time_compare(encoded, encoded_2)
def safe_summary(self, encoded):
return SortedDict([
(_('algorithm'), self.algorithm),
(_('hash'), mask_hash(encoded, show=3)),
])
Adicone esse novo hasher no início da setting PASSWORD_HASHERS no seu arquivo settings.py:
PASSWORD_HASHERS = (
'app.hashers.MySQLOldPasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
)
A função de login fica como de costume:
from django.contrib.auth import authenticate, logout, login as authlogin
from django.core.context_processors import csrf
def logar(request):
if request.POST:
c = {}
c.update(csrf(request))
r = request.POST
usuario = r.get('usuario')
senha = r.get('senha')
u = authenticate(username=usuario, password=senha)
if u is not None:
c = u.get_profile()
if c:
if c.ativo:
if u.is_active:
authlogin(request, u)
# USUARIO LOGADO COM SUCESSO
return HttpResponse('1')
# USUARIO INATIVO
return HttpResponse('-3')
# USUARIO NAO ENCONTRADO / SENHA INCORRETA
return HttpResponse('0')
# REQUISICAO SEM POST
return HttpResponse('-1')
Da mesma forma pode ser feito com outros hashers. Basta adicioná-los ao arquivo hashers.py e listá-los na ordem desejada no settings como vimos acima.
Uma coisa notada analisando os algoritmos de hash disponível no Django (disponíveis em django.contrib.auth.hashers), o password gerado automático que é salvo no banco possui 3 partes separadas pelo simbolo "$":
- Algoritmo de criptografia utilizado
- Número de iterações
- Hash da senha
No exemplo acima que a função old_password() do mysql não possui iterações, a segunda parte é omitda.
hasta!
Nenhum comentário:
Postar um comentário