Mejores prácticas para tarjetas de fidelidad (código de barras y NFC)

2

Actualmente estoy tratando de determinar la mejor manera de diseñar un sistema que integre códigos de barras y pases NFC.

Los códigos de barras se mostrarán en la pantalla de un teléfono. El código de barras (2D, azteca, como mejor para las pantallas de teléfonos) contendrá un número de 16 dígitos que efectivamente será un "ID de paso". Al consultar la base de datos, puede ver el nombre de los titulares, el saldo, etc. Cuando se escanea este código de barras, El comerciante podrá ver una imagen del titular de la cuenta asociada con el código de barras para validar que es el propietario. Estos datos se obtienen de una base de datos sin conexión (actualizada cada 5 minutos) que contiene información sobre cada pase. Podríamos cambiar el número de 16 dígitos después de cada transacción, pero como queremos que las tarjetas NFC hagan referencia al mismo saldo, no hemos hecho esto.

Las tarjetas NFC son un nuevo territorio para mí. Estoy familiarizado con los "hacks" comunes que se usan en las tarjetas Mifare classic, por lo que como mínimo usaremos las tarjetas Mifare Plus. En lo que a mí respecta, la tarjeta NFC simplemente necesita informar al lector NFC de su número de 16 dígitos de la misma manera que lo hace el código de barras para que el saldo prepago se pueda actualizar.

La preocupación que tengo con las tarjetas NFC es que el contenido se puede clonar / editar, que es mucho más fácil de lo que sería con el código de barras (recuerde que está en la pantalla del teléfono, no en la física). Para hacer trampa con el código de barras, debe hacer un esfuerzo para obtener una imagen visual del pase de otra persona, e incluso si eso sucede, podemos simplemente incluir en la lista negra el ID del pase y reembolsarle al propietario original un nuevo pase. Con NFC solo pude pasar mi teléfono por el pase de alguien, ver su ID de pase, actualizar mi ID de pase y listo, estoy usando su saldo.

En conclusión, creo que lo que estoy pidiendo es una opinión de los profesionales sobre si estoy pensando en la dirección correcta. Aprecio que no puedo simplemente almacenar una ID de pase de texto sin formato en la tarjeta NFC, sin esperar ningún problema. Entiendo que tiene que haber una forma de cifrado o una forma de evitar la clonación / edición allí. Simplemente me gustaría saber si el concepto que he proporcionado me parece acertado desde una visión general.

Para ser claros, las tarjetas NFC serían opcionales para aquellos que no pueden mostrar un código de barras en su teléfono inteligente (por ejemplo, las personas mayores, como un pase de autobús concesionario), a diferencia de los clientes que tienen ambos (lo que podrían en teoría, pero no obtener ventaja).

    
pregunta jskidd3 26.07.2016 - 02:10
fuente

4 respuestas

3

Las tarjetas NFC pueden autenticar al lector. Mifare Plus (y Classic también, pero están rotos) puede implementar ACL en sectores, por lo que se debe presentar una clave para leer / escribir un sector. Puede tener dos claves diferentes por sector, llamadas clave A y clave B, y un campo de bits controla qué clave puede hacer qué y si se permite el acceso no autenticado.

Yo creo Mifare DESFire incluso puede hacer criptografía en la propia tarjeta, por lo que no solo la capa de transporte está cifrada y el lector está autenticado, sino que la tarjeta simplemente prueba que tiene la clave secreta del usuario sin revelarla. , donde Plus y Classic solo realizan la autenticación, pero luego se comportan como dispositivos de almacenamiento tontos. Sin embargo, no me cites en eso, revisa las hojas de datos por ti mismo.

Por lo tanto, si usa Mifare Plus, recomendaría configurar una clave para los sectores que contienen los datos confidenciales y luego colocar una ID de usuario, un nonce y un MAC. El MAC debe actualizarse cada vez que se usa la tarjeta para que, incluso si alguien logra copiar una tarjeta, no podrá usarla si se ha usado la tarjeta legítima mientras tanto porque ya se usaría el nonce, y no pueden hacer otro porque el MAC ya no sería válido.

Para los códigos QR, nunca usa un código estático con solo la ID del usuario. Solicite a su aplicación móvil que tenga una conexión con el servidor, y luego, cuando se use, la aplicación debe solicitar un nuevo token del servidor y mostrar solo ese token. Será de un solo uso y tendrá una duración limitada. Esto es similar al enfoque de la tarjeta anterior, excepto porque el teléfono y la máquina POS no se comunican, no hay manera de actualizar el nonce y el MAC, por lo que es mejor que el teléfono solicite uno nuevo cada vez. El único momento en que sería aceptable usar una identificación estática es si necesita algún otro método de autenticación para utilizar realmente los fondos de la tarjeta.

Puedes mantener dos tipos de tokens, uno para la tarjeta NFC y otro para el teléfono. El NFC uno sería estático (ID de usuario) pero protegido por un nonce y un MAC, mientras que el del teléfono es dinámico. El uso de cualquiera de los dos tipos no debería afectar al otro. Además, la tarjeta ni siquiera necesita estar al tanto de su saldo, ya que esta se mantiene en el servidor de todos modos. Almacenar el saldo en la tarjeta sería un riesgo innecesario, sin importar lo bueno que sea el criptográfico (¿recuerdas cuando la gente pensaba que Mifare Classic era seguro? balance ...)

Si decide ir con la ruta DESFire y realmente puede hacer criptografía en la tarjeta, simplemente almacene la ID del usuario y una clave privada en la tarjeta. En el servidor, mantendrá la clave pública, y cada vez que se use la tarjeta, el lector deberá pedirle a la tarjeta que firme un desafío aleatorio con su clave, y el servidor podrá verificar si la firma es válida. Dado que la clave nunca se transmite y es prácticamente imposible sacarla, este enfoque es seguro. Por cierto, es similar a cómo funcionan las tarjetas de crédito. Incluso puede combinar este enfoque haciendo que la tarjeta autentique al lector antes de hablar con él, tal como lo haría en el Plus al configurar las claves de sector y los bits de ACL adecuados.

Finalmente, puede rotar periódicamente las claves de sector, en cada transacción, el lector prueba cada clave utilizada en los últimos X meses (la vida útil de la tarjeta) y, una vez que ha iniciado sesión correctamente, actualiza la clave de la tarjeta a la más reciente. Eso evitaría que un empleado deshonesto que extrajera la clave del software POS copie las tarjetas, aunque el nonce + MAC probablemente lo derrotaría de todos modos, pero otra capa de seguridad siempre es buena. La rotación de claves debe realizarse con regularidad, pero el número total de claves utilizables debe permanecer razonable, esto debe calcularse en función de la vida útil máxima de una tarjeta y el retraso de transacción aceptable. Por ejemplo, si la vida útil es de un año y rotaría las claves todos los meses, el peor de los casos sería que el lector tenga que probar las últimas 12 claves, lo que llevaría aproximadamente un segundo. Ajuste los valores de acuerdo a sus requerimientos.

    
respondido por el André Borie 26.07.2016 - 03:03
fuente
2

Me temo que no estoy familiarizado con NFC, pero tengo algunas sugerencias con respecto al código de barras que se muestra en la pantalla del teléfono.

Puede utilizar una operación criptográfica simple para asegurar el código de barras antes de que se presente. Es posible que el mismo intercambio de datos se presente también en formato NFC.

El principal problema que veo con su sugerencia original es que el código de barras es estático. Es como una contraseña que nunca se cambia. Lo mejor sería que agregue algo de protección contra los ataques de reproducción, de modo que cada vez que se use legítimamente, se necesitará un nuevo código de barras antes de poder procesar otra transacción.

  1. La aplicación debe precargarse no solo con el ID de miembro de 16 caracteres, sino también con una sal secreta. El Salt tiene que ser único por dispositivo, por lo tanto, cuando se instale la aplicación, el dispositivo deberá estar registrado una vez en línea en su equipo servidor antes de que se devuelva un Salt.

  2. El código de barras presentado generado sin conexión contiene:

    • El ID del dispositivo.
    • Un contador, que se incrementa para cada nuevo código de barras.
    • Un valor Hash SHA-256 de ID de dispositivo + Contador + Sal secreta.
      • Puede truncar el valor de hash significativamente sin recibir un impacto de seguridad significativo.

Cuando se lea el código de barras en la terminal, lo hará

  • buscar el ID del dispositivo
  • compare el valor del contador y asegúrese de que sea más alto que el valor de la última transacción utilizada
  • genere el valor Hash para verificar la autenticidad del código de barras
  • continúe con la transacción utilizando la ID de miembro correspondiente

Si el contador no es una opción para usted (requiere sincronización bidireccional de los terminales), podría usar un valor de fecha / hora en su lugar.

De hecho, incluso puedes usar una combinación.

Hay un inconveniente que es que si se roba una Terminal, también se roba la Sal para todos los dispositivos. Si deseaba una mejor seguridad, podría usar un par de claves públicas / privadas para cada dispositivo y luego codificar la identificación de miembro cifrada mediante la clave privada. La Terminal solo necesitaría almacenar la Clave Pública.

    
respondido por el George Bailey 26.07.2016 - 15:42
fuente
1

(demasiado largo para un comentario)

A medida que los teléfonos muestran los códigos de barras, también puede mostrar los únicos para cada transacción agregando números de secuencia.

De esta manera, un código de barras clonado se puede usar una vez como máximo si la transacción se verifica en línea; y para los sistemas fuera de línea, hasta la próxima descarga de datos (que incluye la secuencia más alta para cada "tarjeta").

Para evitar que un atacante genere códigos de barras falsos con nuevos números de secuencia, tendrá que cifrar / firmar digitalmente el contenido del código de barras, preferiblemente usando una clave por usuario.

Una técnica similar se utiliza en el protocolo sin contacto EMV. Puede encontrar muchas inspiraciones en las documentaciones técnicas de los sistemas de pago existentes como este.

    
respondido por el billc.cn 28.07.2016 - 17:07
fuente
0

Lo mejor aquí sería utilizar la protección de la tarjeta Plus en el Nivel de seguridad 1. Esto también significa que su lector no necesita ser compatible con Mifare Plus, todo se puede hacer en el modo Clásico.

Luego puede realizar una autenticación mutua para que sepa que la tarjeta es genuina. Tenga en cuenta que incluso si un estafador puede leer todos los datos en la tarjeta, no pueden usarla.

Esto significa usar una clave compartida en la tarjeta para realizar una autenticación al lector ya la tarjeta. Como la clave no se puede extraer de la tarjeta, la tarjeta no se puede clonar.

El mismo "tipo" de protección podría usarse en los códigos de barras, al insertar datos secretos en el código de barras que se actualizará en cada transacción, y de vez en cuando.

Si usa la aplicación para realizar alguna autenticación en un punto final de API para obtener el Código de Barra actualizado y además implementando la seguridad Plus Plus anterior, no necesitará una imagen del titular, será muy difícil copiar la tarjeta / código de barras.

    
respondido por el sebastian nielsen 26.07.2016 - 03:11
fuente

Lea otras preguntas en las etiquetas