Necesito su consejo sobre la seguridad de este diseño.
Tengo un escenario en el que una aplicación de servidor y una aplicación de tarjeta inteligente necesitan compartir un valor, por ejemplo. 52, que se ha codificado en un token decimal largo pero no hay conexión de red directa entre las dos aplicaciones.
El token tiene 20 dígitos y se transmite por SMS a un destinatario que lo introduce en un terminal, que lo transmite a la tarjeta inteligente.
La pregunta es cuál es la mejor manera de autenticar el token.
Esto es lo que se me ocurrió:
- Creamos una clave simétrica única (K) y la almacenamos de forma segura en el servidor y en el elemento seguro de la tarjeta inteligente.
- Generamos 10000 números aleatorios de 32 dígitos y los almacenamos de forma segura en el servidor y en el elemento seguro de la tarjeta inteligente.
- Para generar un token, el servidor selecciona un índice (n) de los 10000 números aleatorios, por ejemplo, 4821
- Asigna su valor (v) a 7 índices separados (x0, x1 ... x6) en el formato base64 de la clave simétrica (K).
- Finalmente, crea el token agregando
- la base 10 forma de los 7 caracteres (K [x0], K [x1] ... K [x6]),
- el índice (n), y
- el valor original de dos dígitos, es decir, 52
Por ejemplo, si los 7 caracteres en el paso 5 están representados por "19-24-45-22-34-99-45", entonces el token final será "19-24-45-22-34-99- 45-48-21-52 "
La tarjeta inteligente autentica el token realizando los pasos 3-5 utilizando 4821 como su valor para n, luego comparando su token con el token entrante.
Nota: para evitar las repeticiones, tanto el servidor como la tarjeta inteligente anularán el índice 4821, por lo que el conjunto de caracteres asignados a él no se podrá seleccionar ni usar nuevamente.
Esencialmente, lo que creo que hemos logrado es la capacidad de transferir un token de uso único autenticado de 20 dígitos.
Suponiendo que los datos almacenados en el servidor y en el elemento seguro de la tarjeta inteligente sean seguros, ¿hay algún problema en la armadura que deba conocer?
Cualquier consejo será bienvenido.
Gracias
- - - EDITAR (24 de abril de 2013 14:45 pm GMT) - - -
Debió haber sido un día largo y una noche tarde y después de leer todas las respuestas geniales (es decir, los controles de cordura) a continuación, parece que volví a mis cabales y descarté la idea criptográfica casera mal pensada. :)
Como parte de los antecedentes, esta solución está pensada para ser utilizada en áreas rurales con poca o ninguna cobertura de red 3G o GPRS, y prácticamente todo el mundo tiene teléfonos con características baratas que solo admiten GSM y SMS (a diferencia de los teléfonos inteligentes). ). Además, las redes son muy poco confiables.
De todos modos, esto es lo que tengo ahora:
Configurar
- Generar una clave simétrica compartida única (K)
- Generar un archivo (S) de TAN (número de autenticación de transacción)
- Copie K y S en la base de datos del servidor y en el elemento seguro de la tarjeta inteligente
Transaction
Si un servidor necesita enviar una cantidad (v) a una tarjeta inteligente,
- Carga el archivo S y selecciona un nonce (n), es decir,
n = S[0]
- Anula el nonce al eliminarlo del archivo S (evita los ataques de reproducción)
- Crea un mensaje concatenando la cantidad y el nonce, es decir,
m = v || n
- Crea un texto cifrado (e1), es decir,
e1 = H(K,m)
donde H="HMAC-SHA-1" o "CBC-MAC-Y", es decir, ISO / IEC 9791-1 Algoritmo 3 - Convierte el texto cifrado en base 10 y lo envía (a través de SMS) al teléfono móvil del usuario
- Deduce la cantidad del saldo del lado del servidor del usuario
Cuando el usuario 'recibe el código por SMS, escribe la cantidad (v) y el código en el terminal que lo transmite a la aplicación de tarjeta inteligente, que a su vez hace lo siguiente:
- Carga el archivo S y selecciona un nonce (n), es decir,
n = S[i]
donde i = 0 - Crea un mensaje al concatenar la cantidad y el nonce, es decir,
m = v || n
- Crea un texto cifrado (e2), es decir,
e2 = H(K,m)
, donde H="HMAC-SHA-1" o "CBC-MAC-Y", es decir, ISO / IEC 9791-1 Algoritmo 3 - Si es
e1 != e2
, repite los pasos (1) - (3) mientras incrementa (i) hasta 20 veces (para permitir la deriva). Si no existe una coincidencia, si aparece un mensaje de error y se cierra - Si es
e1 == e2
, acepta el valor como un abono al saldo del lado del cliente del usuario - Finalmente, invalida todos los nonces que se intentaron en el paso (1) al eliminarlos del archivo S
Archivos TAN
Un archivo TAN es una lista de 1000 números aleatorios, cada uno de los cuales es un número de autenticación hexadecimal (TAN) de 8 caracteres. Se utilizará para determinar el valor nonce que se agregará a un mensaje para garantizar su singularidad y evitar así los ataques de repetición.