Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/11/2018, 13:10
sk0rpi0n
 
Fecha de Ingreso: julio-2009
Mensajes: 121
Antigüedad: 14 años, 8 meses
Puntos: 1
Encriptacion en Python pasar a PHP

Hola, estoy transcribiendo un sistema de python a php... y estoy teniendo problemas con el apartado de registro, el resto ya lo tengo todo hecho...

En este apartado hay 2 encriptaciones la MD5 (que se usaba antes) y la nueva que estamos usando ahora que es la PBKDF2.

Alguien podría explicarme como llegar a ese resultado para usarlo con php porque la verdad acá estoy completamente negado.



Código:
import hashlib
import hmac
import base64
import binascii
import secrets

class Hasher:
	algorithm = None
	separator = '$'
	
	@classmethod
	def encode(cls, password, salt = None, *stuff):
		assert password is not None
		if not salt:
			salt = secrets.token_hex(10)
		assert cls.separator not in salt
		(hash, *stuff) = cls._encode_impl(password, salt, *stuff)
		hash = base64.b64encode(hash).decode('ascii').strip()
		return cls.separator.join([cls.algorithm] + stuff + [salt, hash])
	
	@classmethod
	def extract_salt(cls, encoded):
		try: (*_, salt, _) = encoded.split(cls.separator)
		except ValueError: return None
		return salt
	
	@classmethod
	def verify(cls, password, encoded):
		try: (algorithm, *stuff, salt, hash) = encoded.split(cls.separator)
		except ValueError: return False
		
		try: hasher = cls._HASHERS[algorithm]
		except KeyError: return False
		
		assert algorithm == hasher.algorithm
		encoded_2 = hasher.encode(password, salt, *stuff)
		return hmac.compare_digest(encoded, encoded_2)
	
	_HASHERS = {}

class PBKDF2PasswordHasher(Hasher):
	algorithm = 'pbkdf2_sha256'
	iterations = 24000
	
	@classmethod
	def _encode_impl(cls, password, salt, iterations = None):
		if not iterations:
			iterations = cls.iterations
		iterations = int(iterations)
		hash = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), iterations, None)
		return (hash, str(iterations))
Hasher._HASHERS[PBKDF2PasswordHasher.algorithm] = PBKDF2PasswordHasher

class MD5PasswordHasher(Hasher):
	algorithm = 'md5'
	digest = hashlib.md5
	
	@classmethod
	def _encode_impl(cls, password, salt):
		md5 = hashlib.md5()
		md5.update((salt + password).encode('utf-8'))
		return (md5.digest(),)
	
	@classmethod
	def verify_hash(cls, hash_1, encoded):
		try: (_, _, hash) = encoded.split(cls.separator)
		except ValueError: return False
		hash = binascii.hexlify(base64.b64decode(hash)).decode('ascii')
		return hmac.compare_digest(hash_1, hash)
Hasher._HASHERS[MD5PasswordHasher.algorithm] = MD5PasswordHasher

hasher = PBKDF2PasswordHasher
hasher_md5 = MD5PasswordHasher
Ejemplo contraseña "123456"
Código:
pbkdf2_sha256$24000$d3bda36e23c8e4c62ccb$jjHg3zGe+ Gdq45Ol0kkXoChJuIyfzEfnxiLqctjRAVQ=
La parte de MD5 pense que ya lo habia logrado, pero luego me di cuenta que el resultado del md5 es algo asi como :
Código:
"pw_md5": "md5$cabcada22ba54552f0ba$8Bbqdbsq+n9UK8uUF2dpkQ=="

Última edición por sk0rpi0n; 26/11/2018 a las 13:20