Se me ocurrió la idea de que puedo almacenar contraseñas como enteros que ocupan 4 u 8 bytes en lugar de un hash que toma como 150 bytes o algo así. Escribí esta función que convierte una cadena en un entero en función de algunas matemáticas elementales.
function pass($pass) {
$value = 0;
for ($i = 0, $l = strlen($pass); $i < $l; $i++) {
$value += pow(ord(~$pass[$i]), 1/2);
}
return (int)round(pow($value, (int)('1.' . $value)) * 10000000000);
}
var_dump(pass('M'));
var_dump(pass('m'));
int (133416640641)
int (120830459736)
Como lo veo para ser hackeado primero, el hacker necesita saber el valor int almacenado para la contraseña y el algoritmo. Pueden obtener el valor ya sea si piratean mi base de datos o si toman un archivo de copia de seguridad antiguo, que se sabe que es el exploit más común (supongo), pero aún así, si no conocen el algoritmo, ¿no podrían romperlo?
No creo que sea posible revertir un valor convertido a la cadena original, ya que sería un problema con la complejidad de la cantidad de caracteres que contiene la cadena, ¿no?
La otra posibilidad es si ingresan accidentalmente un valor que se convierte al mismo valor de la contraseña original, en teoría supongo que debería haber una cantidad infinita de cadenas que pueden convertirse al mismo valor pero no estoy seguro Las posibilidades reales de que esto ocurra, así como este problema, también están presentes en los algoritmos de hash conocidos como colisión.
Como probablemente ya adivinaste, estoy muy lejos de ser un experto en seguridad y supongo que todo esto es basura de lo que estoy hablando en este momento, pero quiero saber por qué.