Foros del Web » Programando para Internet » PHP »

Encriptacion Contraseña

Estas en el tema de Encriptacion Contraseña en el foro de PHP en Foros del Web. Buenas, estoy trasladando un sistema de python a php y estoy atascado en la parte del registro y encriptación de claves. El resto del sistema ...
  #1 (permalink)  
Antiguo 26/11/2018, 06:43
 
Fecha de Ingreso: julio-2009
Mensajes: 121
Antigüedad: 15 años, 3 meses
Puntos: 1
Encriptacion Contraseña

Buenas, estoy trasladando un sistema de python a php y estoy atascado en la parte del registro y encriptación de claves.

El resto del sistema pude pasarlo sin problemas y solo me falta esto... como nunca use python se me complica...

Necesitaría saber como pasar esta parte a PHP es donde encripta la contraseña de la cuenta creada:

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
este es un ejemplo de la clave "123456"

pbkdf2_sha256$24000$d3bda36e23c8e4c62ccb$jjHg3zGe+ Gdq45Ol0kkXoChJuIyfzEfnxiLqctjRAVQ=

Última edición por sk0rpi0n; 26/11/2018 a las 06:50
  #2 (permalink)  
Antiguo 26/11/2018, 10:02
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 7 meses
Puntos: 120
Respuesta: Encriptacion Contraseña

primero , lo mejor era que preguntes en el foro de PYTHON para que encuentres explicacion, del funcionamiento, luego en php hacer la traduccion, ya que habra funciones que hacen lo mismo pero con distinto nombre
y de esa explicacion, ya partes y realias pruebas AISLADAS parte por parte como ejemplo
puedes aislar este fragmento
Código Python:
Ver original
  1. def _encode_impl(cls, password, salt):
  2.         md5 = hashlib.md5()
  3.         md5.update((salt + password).encode('utf-8'))
  4.         return (md5.digest(),)
y en un archivo python aparte, probar que es lo que devuelve el "digest()"

Código Python:
Ver original
  1. import hashlib
  2.  
  3. md5 = hashlib.md5()
  4. md5.update(("salt + password").encode('utf-8'))
  5. print (md5.digest(),md5.hexdigest())
y retorna

Código C:
Ver original
  1. b'\xe0\xe1}\xa4\x048\xc7\xe4\x0fY\xa0\xbf<p\xe4\xd4'
  2. e0e17da40438c7e40f59a0bf3c70e4d4
por ejemplo aca muestra que el md5.digest, antepone una b' que indica BYTES eso creo jeeje

por lo cual seria de suponer que es un MD5 en modo RAW

php seria segun el manual

http://es.php.net/manual/en/function.md5.php

Código PHP:
Ver original
  1. md5("salt + password",true); //como resultado seran texto en bytes
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #3 (permalink)  
Antiguo 26/11/2018, 12:39
 
Fecha de Ingreso: julio-2009
Mensajes: 121
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Encriptacion Contraseña

Hola, si el de MD5 lo pude hacer... el que no puedo hacer es el otro método jajaja

pifie al poner todo el código...

El que tengo que sacar como es es el de PBKDF2PasswordHasher

Etiquetas: contraseña, encriptacion, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:10.