Tengo un cliente de Android simple que necesita 'hablar' con un oyente HTTP de C # simple. Quiero proporcionar un nivel básico de autenticación pasando el nombre de usuario / contraseña en las solicitudes POST.
El hash MD5 es trivial en C # y proporciona suficiente seguridad para mis necesidades, pero parece que no puedo encontrar cómo hacerlo en el extremo de Android.
EDITAR: Solo para abordar las preocupaciones planteadas sobre la debilidad de MD5: el servidor C # se ejecuta en las PC de los usuarios de mi cliente Android. En muchos casos, accederán al servidor usando wi-fi en sus propias LAN pero, bajo su propio riesgo, pueden optar por acceder a él desde Internet. Además, el servicio en el servidor debe utilizar el paso a través del MD5 a una aplicación de terceros sobre la que no tengo control.
fuente
Respuestas:
Aquí hay una implementación que puede usar (actualizada para usar convenciones Java más actualizadas -
for:each
bucle, enStringBuilder
lugar deStringBuffer
):Aunque no se recomienda para sistemas que involucran incluso el nivel básico de seguridad (MD5 se considera roto y se puede explotar fácilmente ), a veces es suficiente para tareas básicas.
fuente
NoSuchAlgorithmException
)?La respuesta aceptada no funcionó para mí en Android 2.2. No sé por qué, pero se estaba "comiendo" algunos de mis ceros (0). Apache commons tampoco funcionaba en Android 2.2, porque utiliza métodos que solo son compatibles a partir de Android 2.3.x. Además, si solo desea MD5 una cadena, Apache commons es demasiado complejo para eso. Por qué uno debería mantener una biblioteca completa para usar solo una pequeña función de ella ...
Finalmente encontré el siguiente fragmento de código aquí que funcionó perfectamente para mí. Espero que sea de utilidad para alguien ...
fuente
El código de androidsnippets.com no funciona de manera confiable porque los ceros parecen cortarse del hash resultante.
Una mejor implementación está aquí .
fuente
Si usar Apache Commons Codec es una opción, entonces esta sería una implementación más corta:
O SHA:
Fuente de arriba.
Siga el enlace y vote a favor de su solución para adjudicar a la persona correcta.
Enlace de repositorio de Maven: https://mvnrepository.com/artifact/commons-codec/commons-codec
Dependencia actual de Maven (a partir del 6 de julio de 2016):
fuente
Una solución anterior usando DigestUtils no funcionó para mí. En mi versión de Apache commons (la última de 2013) no existe tal clase.
Encontré otra solución aquí en un blog . Funciona perfectamente y no necesita Apache commons. Parece un poco más corto que el código en la respuesta aceptada anterior.
Necesitará estas importaciones:
fuente
Esta es una ligera variación de las respuestas de Andranik y Den Delimarsky anteriores, pero es un poco más concisa y no requiere ninguna lógica bit a bit. En su lugar, utiliza el
String.format
método incorporado para convertir los bytes en cadenas hexadecimales de dos caracteres (no elimina los ceros). Normalmente, solo comentaría sus respuestas, pero no tengo la reputación de hacerlo.Si en su lugar desea devolver una cadena en minúsculas, simplemente cambie
%02X
a%02x
.Editar: usando BigInteger como con la respuesta de wzbozon, puede hacer que la respuesta sea aún más concisa:
fuente
Hice una biblioteca simple en Kotlin.
Agregar en Root build.gradle
en App build.gradle
Uso
En Kotlin
Luego use el método hash ()
Devolverá MD5 y SHA-1 respectivamente.
Más sobre la biblioteca
https://github.com/ihimanshurawat/Hasher
fuente
Aquí está la versión de Kotlin de la respuesta de @Andranik. Necesitamos cambiar
getBytes
atoByteArray
(no es necesario agregar el juego de caracteres UTF-8 porque eltoByteArray
juego de caracteres predeterminado es UTF-8) y convertir la matriz [i] a un enteroEspero que ayude
fuente
En nuestra aplicación MVC generamos param largo
y lo mismo en la aplicación de Android (thenk ayuda a Andranik)
fuente
He utilizado el método siguiente para darme md5 pasando la cadena para la que desea obtener md5
fuente
Utilice SHA-512, MD5 no es seguro
fuente
MD5 es un poco antiguo, SHA-1 es un algoritmo mejor, aquí hay un ejemplo .
( Además, como señalan en esa publicación, Java maneja esto por sí solo, sin código específico de Android ) .
fuente
La conversión de toHex () demasiado derrochadora prevalece en otras sugerencias, de verdad.
fuente
esto funciona perfectamente para mí, lo usé para obtener MD5 en LIST Array (luego convertirlo en un objeto JSON), pero si solo necesita aplicarlo en sus datos. escriba formato, reemplace JsonObject con el suyo.
¡Especialmente si tiene una discrepancia con la implementación de Python MD5, use esto!
fuente
Las soluciones proporcionadas para el lenguaje Scala (un poco más corto):
fuente