Es posible proporcionar un servicio en el que se otorga una versión de prueba gratuita a cada dispositivo sin la posibilidad de que un individuo pueda obtener múltiples pruebas gratuitas en un solo dispositivo. Si es imposible, ¿conoces una forma de dificultar la obtención de múltiples pruebas gratuitas?¿Es posible tener una sola prueba por dispositivo?
Respuesta
Puede generar la clave de licencia basada en el ID único del dispositivo, la fecha de solicitud y su propia clave privada para crear una licencia que solo es válida hasta cierta fecha.
Su aplicación verificará que la clave de licencia sea válida decodificando la clave de licencia con su clave pública y comparando su fecha de caducidad e ID de dispositivo. Las personas no pueden falsificar una solicitud, ya que la clave de licencia solo es válida para la fecha prescrita y una ID de dispositivo determinada.
(pista: leer sobre criptografía de clave pública)
Sin embargo, no es totalmente a prueba de tontos. Un atacante realmente determinado puede rootear su dispositivo e instalar un firmware personalizado que le permita controlar el identificador devuelto por "getDeviceId()". Esto no es algo que la mayoría de la gente estaría dispuesta a hacer, la mayoría de las personas preferiría encontrar una aplicación gratuita alternativa o simplemente comprar la aplicación en lugar de seguir esa ruta. Contra los crackers con ese tipo de determinación y habilidades, no hay mucho que puedas hacer.
Una vía alternativa de ataque sería reemplazar la clave pública que envía con la aplicación con la combinación de clave privada/pública del atacante, y puede escribir potencialmente un generador de claves que pueda generar una clave de licencia para la aplicación falsificada. Puedes dificultar este ataque mediante la autoverificación de tu propio ejecutable.
Sin embargo, ningún esquema de seguridad es infalible, la aplicación java/android puede ser de ingeniería inversa y un hacker determinado puede forjar su aplicación y desactivar sus comprobaciones de licencia. La única forma infalible de evitar el uso no autorizado de una aplicación es no distribuir la aplicación en absoluto.
Claro, pero deberá configurarlo para almacenar identificadores de dispositivos en su propio servidor. En un iPhone, se puede obtener el UDID usando
UIDevice *device = [UIDevice currentDevice];
NSString *uniqueIdentifier = [device uniqueIdentifier];
Usted puede hacer una llamada de base de datos y acompare uniqueIdentifier
a su lista almacenada, asegurando que sólo un ensayo puede ser activado por dispositivo.
En android, getDeviceID()
le proporciona un identificador de dispositivo único. compruebe the documentation para obtener más información sobre esto.
+1, pero, ¿es esto realmente seguro? Al final del día, tengo que enviar una solicitud a mi servidor, y ¿qué impide que un atacante falsifique una solicitud? – rook
cierto; pero no creo que haya otra manera, ya que no puedes controlar la distribución de aplicaciones (debido a App Store y Marketplace). Esto definitivamente lo hace difícil, pero no imposible. –
@Rook: podría hash la solicitud con una clave secreta y verificarla en su servidor. – donkim
Si no me falta algo, mi solución sería sencilla. Haré que expire el servicio proporcionado por la aplicación, no la aplicación en sí. Esto se puede hacer utilizando algún mecanismo de token como oAuth. (con un token que expira con una duración considerable, en este caso su período de prueba). Durante el proceso de registro del cliente, crearé el token de solicitud en función de la identificación del dispositivo Android y la hora solicitada. Checkout oAuth, podría ser una molestia, pero casi todos los principales proveedores de servicios lo usan.
Imagino que podría obtener el 99% del efecto de un esquema más complejo con uno simple: simplemente almacene un archivo en algún lugar del dispositivo que indique que la prueba ha expirado. De acuerdo, los usuarios conocedores de la tecnología podrían encontrar y eliminar el archivo, pero la gran mayoría no se molestará: el dispositivo es una losa inescrutable de magia para ellos, entrometerse en los archivos internos podría desagradar a los pequeños gnomos que comercian furiosamente detrás del dispositivo. pantalla.
Puede hacer las cosas más difíciles al ocultar el archivo de bloqueo, cambiando el nombre y la ubicación en función de la identificación del dispositivo; de esta manera es mucho más difícil para alguien compartir instrucciones sobre cómo evadir su plan de prueba.
Como han notado las otras respuestas: ningún sistema es infalible, siempre hay alguien por ahí que es más listo que usted y que disfrutará de descifrar su plan. El truco es no perder el tiempo dándole a este tipo un entrenamiento mental y en su lugar atender a la mayoría.
¿Qué le parece guardar la dirección MAC del adaptador wifi? Posiblemente en su servidor y su aplicación consultará el servidor si ese MAC ya está registrado.
¿CON EL PERMISO DEL USUARIO, en la primera ejecución de la aplicación, pregunte al servidor si la dirección MAC del dispositivo actual ya está registrada? Si no, almacene la dirección MAC en su servidor. Si ya está registrado, solicite al usuario que compre la aplicación para continuar utilizando.
Este método se puede complementar con algunos algoritmos criptográficos como lo sugiere Lie Ryan para proporcionar seguridad y bloqueos adicionales y/o período de prueba.
No sé mucho sobre el iPhone, pero creo que cada iPhone tiene un adaptador wifi y cada adaptador wifi tiene una dirección MAC única. También revise el lado legal de esta solución ya que almacenar el MAC puede generar problemas/inquietudes de privacidad. Entonces, antes de usar esto, verifique las leyes aplicables.
- 1. ¿Es posible tener una línea por cada bloque en Ruby?
- 2. ¿Es posible tener una clase privada?
- 3. Prueba de WIA sin tener un escáner/dispositivo de cámara
- 4. ¿Es posible tener una selección sin tabla con varias filas?
- 5. ¿Es posible tener uritemplates "sobrecargados"?
- 6. ¿Es posible parametrizar una prueba de nunit?
- 7. Android: ¿Es posible tener múltiples preferencias compartidas distintas por aplicación?
- 8. ¿Es posible ejecutar muchos procedimientos almacenados en una sola operación?
- 9. ¿Es posible ejecutar FindBugs contra una sola clase de Java?
- 10. ¿Es posible incluir múltiples módulos en una sola declaración "incluir"?
- 11. ¿Es posible tener una llave foránea compuesta en los rieles?
- 12. ¿Es posible tener un dibujo animado dibujable?
- 13. ¿Es posible usar un dispositivo para ejecutar una aplicación exclusivamente?
- 14. ¿Es posible tener un div no rectangular?
- 15. ¿Es posible tener permisos "opcionales" en Android?
- 16. ¿Puede tener múltiples MySqlCommand en una sola transacción?
- 17. ¿Es posible tener especificaciones parametrizadas en RSpec?
- 18. ¿Es posible tener un out ParameterExpression?
- 19. ¿Es posible tener DataMembers opcionales en WCF?
- 20. ¿Es posible tener ClassCleanup determinista en la prueba de unidad MSTest/VS?
- 21. ¿Es posible tener una instancia de clase de tipo "local"?
- 22. ¿Es posible tener tablas temporales en una función?
- 23. ¿Es posible tener una vista indexada en MySQL?
- 24. En C++, ¿es posible tener una función puramente virtual definida?
- 25. ¿Es posible tener una interfaz que tenga métodos privados/protegidos?
- 26. ¿Es posible usar ambos orden por y en una sola consulta
- 27. ¿Es posible fusionar dos páginas creadas por SandCastle en una sola página principal?
- 28. C# - ¿Es posible tener params nulos?
- 29. ¿Es posible tener validadores con parámetros?
- 30. ¿Es posible tener cifrado con múltiples claves privadas (PHP)?
Tenga en cuenta que la identificación de Android aparentemente no es única: se alega que existe una versión de modelo/firmware por la que todos los dispositivos tienen la misma identificación. –
Lo hago :) También Windows Mobile. Tenga en cuenta que la identificación única del dispositivo es muy difícil de encontrar en Android. –
La ID del dispositivo obtenida a través de Settings.Secure puede cambiar en un restablecimiento de fábrica del dispositivo. La identificación del dispositivo obtenida a través de TelephonyManager puede no existir (si, por ejemplo, el dispositivo no es un teléfono). –