Hola,
Después de muchísimas vueltas y reflexionando sobre los consejos que me dio kub0x en mis post anteriores he pensado en el siguiente algoritmo de autenticación:
Inscripción:
Cliente: - Escoge un nombre usuario
- Proporciona su numero de teléfono móvil
- Envía estos datos
Servidor: - Crea una tarjeta de coordenadas con 20 de coordenadas aleatorias (como
sugirió kub0x números entre 10.000 y 99.999)
A B C D
1 -- -- -- --
2 -- -- -- --
3 -- -- -- --
4 -- -- -- --
5 -- -- -- --
Escoge 3 de ellas al azar.
Ej: A3,C5 y D4 (12345, 99876, 68872 )
Suma los numeros pertenecientes a cada coordenada entre si
A3 = 12345 = 1+2+3+4+5 = 15
C5 = 99876 = 9+9+8+7+6 = 39
D4 = 68872 = 6+8+8+7+2 = 31
Concatena estos resultados en una variable "$base"
$base = "153931";
- Escoge 1 color al azar de los 7 básicos del arco iris
- A cada color corresponde un array aleatorio de números
Ej: $rojo = [4,0,3,1,2,5] donde cada elemento del array representara la posición
dentro de "$base"
- Emplea este array como algoritmo para alargar la "base" para emplearlo como
passphrase
Ej: $rojo[0] = 4 representara el quinto elemento de $base (empezando con 1)
que seria en este caso el 3
entonces hace 153931 ^ 3 = 3647356987253491 y lo concatena como string en
una variable $passphrase
etc ... etc ver ejemplo PHP abajo
En el ejemplo he utilizado potencias ... pero se podrá usar lo que uno quiere
$passphrase = '';
$base = "153931";
$algoritmo = [4,0,3,1,2,5]; //$rojo
foreach($algoritmo as $posicion){
if($base[$posicion] == "1"){
$exponent = "10"; //para no dejarlo a la potencia 1
}else{
$exponent = $base[$posicion];
}
$passphrase .= bcpow($base,$exponent); }
//lo que daría como resultado la passphrase siguiente:
//36473569872534917468973308479888166911376979002445509842001282099801485215668609954341030161369639802607001968497718642322204407729767913865136473569872534917468973308479888166911376979002445509842001282099801
Esta sera la passphrase "P" para ser empleada en el cifrado simétrico
36473569872534917468973308479888166911376979002445509842001282099801485215668609954341030161369639802607001968497718642322204407729767913865136473569872534917468973308479888166911376979002445509842001282099801 Envía al usuario por SMS la tarjeta de coordenadas + La referencia a una de las tres coordenadas empleadas mas arriba ej: D3 y el color ej: rojo (verán mas abajo en la autenticación porque D3 y no D4 que se utilizo realmente )
Lo que el usuario tendrá que memorar seria "D3" y "rojo" ... la tarjeta de coordenadas la imprime o la apunte (de todos modos aconsejado que la borre del móvil)
En el servidor se guarda:
Un hash (sha3) sobre la passphrase "P"
La tarjeta de coordenadas y los datos del usuario cifrados (simétrico) usando la passphrase "P"
Dos referencias a las coordenadas de la tajeta Ej: A3 y D4 (para este caso)
Y un numero de referencia de 1 a 20 en vez de la tercera coordenada ej: 1 (verán mas abajo en la autenticación porque 1 en el caso actual)
Guarda también el color que escogió (o un hash)
Enviara al administrador la passphrase P cifrada con otro algoritmo (parecido al de arriba) y este lo guardara en una maquina sin conexión a internet + otras medidas de seguridad (para comprobar manualmente en caso de perdida).
Autenticacion:
Cliente: - Introduce su nombre usuario
Servidor: - Si el usuario es correcto
- Le pide escoger su color (que memorizo)
- Si el color es correcto le manda el algoritmo utilizado Ej: $rojo = [4,0,3,1,2,5] ,
las dos coordenadas que se usaron para construir la passphrase mas un numero explicado mas abajo
- S le pide que sume de memoria (o en papel ideal seria que si lo suma en una calculadora que no sea la del aparato con el que se esta conectando a internet)
Normalmente no seria tan difícil sumar 5 números de memoria
y apuntar solo el resultado en la casilla correspondiente (y no el valor de la coordenada)
Ej:
A3 = 12345 = 1+2+3+4+5 = 15
C5 = 99876 = 9+9+8+7+6 = 39
Para la tercera referencia (Que se supone que memorizo al inscribirse y recibio D3 en vez de D4 que se utilizo realmente ) solo recibe el numero 1
Entonces se le pide a que al la coordenada que memorizo (D3) le suma 1 (en este caso ) lo que le dara D4 y que haga la suma como en las de arriba y apunte el resultado en la casilla
secreto +1 = D3 +1 = D4 = 68872 = 6+8+8+7+2 = 31
(llamaremos secreto a la referencia D3 que el usuario tendra que memorizar)
Si el secreto era D5, entonces D6 no existe (porque solo hay 20 coordenadas) y el siguiente sera A1 (algo parecido a los módulos) empezar desde el principio
o si el numero que recibe el usuario sera mas grande por ej. 10 y el secreto es D3 entonces la coordenada correcta seria B3
O sea si contando desde su secreto el nr que recibe llega al final D5 ... continua con el A1 A2 etc
Ej:
D5 + 1 = A1
D3 + 6 = A3
D3 + 10 = B3 ... etc
El resto se hace automáticamente en el lado cliente y se regenera la passphrase P
la cual se puede primero comprobar con su hash y si esto es ok se autentifica y se desencriptan sus datos
Si la autenticación es OK el servidor genera otros credenciales para la siguiente autenticación
También controla la sesión en curso con combinaciones de tokens + tiempo + la passphrase correcta que no se utilizara otra vez para login
Resumiendo: - El usuario solo tendrá que memorar Un color (ej: rojo) y dos dígitos ej: D3 (y no el contenido de la coordenada. Solo la referencia)
- Si alguien intenta mandar su usuario y su color pero no llega autenticarse se le notificara al usuario y si las dos coordenadas pedidas son correctas, (pero no la secreta) se pregunta al usuario y si no ha sido el, se le cambia la tarjeta de coordenadas obligatorio
- La passphrase no se guarda en ningún lado (eventualmente el administrador las guarda en otra maquina con otro cifrado y sin conexión a internet para recuperación y comprobación de los datos manualmente en caso de perdida)
Se le puede pedir al usuario al principio si acepta esto ... pero si no acepta ... pierde todo si se pierde la tarjeta de coordenadas o se olvida la que tiene como secreta
- No revela los números de las coordenadas que tiene
- La coordenada que tiene secreta siempre es otra (Aunque el memoriza la misma siempre)
- Aunque se le robe la tarjeta de coordenadas no se podrá saber cual es la secreta (bueno ... digamos ... bastante difícil)
- Siempre que se ha conectado de otra maquina se le avisa
- No habrán nunca dos sesiones permitidas al mismo tiempo
- Esto si, tiene que hacer unas sumas simples de memoria ( Eso le tendrá el cerebro entrenado
)
Bueno dicho esto, como muchas cosas, en teoría parece bien pero con mis escasos conocimientos de matemática no se si esto seria un sistema fiable por esto espero sus opiniones
Cada paso se puede complicar de varias formas pero espero primero vuestras opiniones, criticas , mejoras ,puntos debiles etc.
Como duda mas grande que tengo por ahora:
¿es la passphrase P fuerte desde el punto de vista criptografico ? (se pasa tambien por pbkdf2 )
He olvidado decir :
Para el cifrado simétrico he pensado en el AES-256 CBC siguiendo los consejos de @kub0x:
Salt e IV aleatorios,
pbkdf2 con iteraciones diferentes por cada algoritmo, usuario y autentificacion para la "passphrase" ,
cifrado AES-256 CBC padding: Pkcs7 ,
hmac para el control de integridad
Saludos y espero vuestras opiniones