Contraseña de una sola vez con token de hardware

0

Estoy investigando métodos de autenticación de software que son fáciles pero seguros de implementar en mis propios proyectos.

IDEAS: Pasos para autenticar aplicaciones

La aplicación se ejecuta desde una unidad USB, ya que nunca se instala en ninguna computadora.

  1. Cada vez que se ejecuta, el software inicia información como la ID de hardware USB y tal vez una ID única para la aplicación se recopila y de alguna manera se inserta de forma segura en una cadena similar a una clave de activación.
  2. Esta cadena se pasa luego como un parámetro a una función de PHP donde se invierte (lado del servidor) y se verifica el contenido en una base de datos para verificar que la aplicación se ejecutó desde una llave USB 'autorizada' y no se copió de una a otra. otra (ya que la ID de H / W cambiaría y no coincidiría con la de la base de datos): efectivamente, esto minimizaría la posibilidad de que un cliente obtenga dos "licencias de software" que funcionen.

Preguntas

La idea es poder recuperar las columnas de la fila en la base de datos, que coincida con el ID de HW particular y el secreto único de la aplicación ubicará la fila correcta. El PHP se usa para verificar si otras entradas en esa fila también coinciden con otros valores, como si la clave HW está caducada o no. Sin embargo, , para evitar que el usuario use el mismo parámetro de cadena cada vez, debería ser aleatorio y casi imposible de calcular / adivinar, pero enlazar a la misma ubicación en la base de datos.

Ahora estoy considerando el cifrado en lugar del hash (para el beneficio de mantener los datos), ya que se puede descifrar usando una clave maestra en el servidor. Entiendo que el hash solo se convierte en una dirección y tal vez no estaba expresando el escenario correctamente antes de esta edición, así que espero que las cosas se hayan vuelto un poco más claras. ¿Podría alguien guiarme en la dirección correcta? ¿Cómo se hace esto?

Realmente agradecería cualquier comentario e ideas sobre cómo hacer que esto suceda correctamente.

    
pregunta ProGrammer 24.11.2017 - 02:34
fuente

1 respuesta

1

Desea una cadena que sea única cada vez que se marque la clave de registro y algo que el usuario no podrá realizar ingeniería inversa fácilmente (y, por lo tanto, omita sus restricciones de DRM).

Una forma de hacer esto es hacer que la aplicación almacene su clave criptográfica. Usted concat / combina las claves de software, las ID y cualquier otro dato que desee, junto con una cadena aleatoria que cambia cada vez que se accede / solicita esta información. Cifras esto con la clave criptográfica y la pasas a tu servidor. El servidor descifra con su clave criptográfica, extrae los datos descifrados y vuelca la cadena aleatoria.

  1. El uso de la cadena aleatoria significa que la cadena de texto cifrado resultante es única cada vez, lo que dificulta la ingeniería inversa.
  2. Encriptación significa que puede leer los datos de texto sin formato aunque el cyphertext sea diferente cada vez (una característica que un hash directo no puede proporcionar).

La desventaja es que el cyphertext puede ser grande (dependiendo de cómo lo hagas). También debes asegurarte de que el texto aleatorio tenga una longitud variable para que sea más difícil adivinar las cadenas de componentes.

El otro problema que tendrá es el manejo correcto de la clave en su aplicación. Una vez que un usuario obtiene eso, puede crear sus propias cadenas que pasarán sus pruebas.

En general, está preguntando sobre cómo diseñar una solución DRM. Hay muchas maneras establecidas de hacer esto, y te recomiendo que mires sus patrones de diseño.

La lucha común es que una vez que colocas tu aplicación en manos de un usuario, pierdes mucho control. Es mejor diseñar su solución para que no importe si un usuario copia su software, o diseña un marco sobre el cual se ejecuta su aplicación en lugar de localmente (lo cual es la forma en que las aplicaciones basadas en web son tan populares) También tiene que sopesar los costos / beneficios de todo este trabajo de diseño en comparación con el trabajo que tendrá que realizar un usuario para derrotarlo. ¿Estás poniendo tus esfuerzos en el lugar correcto?

    
respondido por el schroeder 24.11.2017 - 12:15
fuente

Lea otras preguntas en las etiquetas