Eu tenho um cliente Android simples que precisa 'conversar' com um ouvinte HTTP C # simples. Desejo fornecer um nível básico de autenticação passando nome de usuário / senha em solicitações POST.
O hashing MD5 é trivial em C # e fornece segurança suficiente para minhas necessidades, mas não consigo descobrir como fazer isso no final do Android.
EDIT: Apenas para resolver as preocupações levantadas sobre a fraqueza do MD5 - o servidor C # é executado nos PCs dos usuários do meu cliente Android. Em muitos casos, eles acessarão o servidor usando wi-fi em suas próprias LANs, mas, por sua própria conta e risco, eles podem optar por acessá-lo da Internet. Além disso, o serviço no servidor precisa usar passagem do MD5 para um aplicativo de terceiros sobre o qual não tenho controle.
fonte
Respostas:
Aqui está uma implementação que você pode usar (atualizada para usar convenções Java mais atualizadas -
for:each
loop, emStringBuilder
vez deStringBuffer
):Embora não seja recomendado para sistemas que envolvem até mesmo o nível básico de segurança (MD5 é considerado quebrado e pode ser facilmente explorado ), às vezes é suficiente para tarefas básicas.
fonte
NoSuchAlgorithmException
)?A resposta aceita não funcionou para mim no Android 2.2. Não sei por que, mas ele estava "comendo" alguns dos meus zeros (0). O Apache commons também não funcionou no Android 2.2, porque ele usa métodos compatíveis apenas a partir do Android 2.3.x. Além disso, se você deseja apenas MD5 uma string, o Apache commons é muito complexo para isso. Por que se deve manter uma biblioteca inteira para usar apenas uma pequena função dela ...
Finalmente eu encontrei o seguinte trecho de código aqui que funcionou perfeitamente para mim. Espero que seja útil para alguém ...
fonte
O código androidsnippets.com não funciona de maneira confiável porque os 0s parecem ter sido cortados do hash resultante.
Uma implementação melhor está aqui .
fonte
Se usar o Apache Commons Codec for uma opção, esta seria uma implementação mais curta:
Ou SHA:
Fonte para acima.
Siga o link e vote positivamente na solução para premiar a pessoa correta.
Link do repositório Maven: https://mvnrepository.com/artifact/commons-codec/commons-codec
Dependência atual do Maven (em 6 de julho de 2016):
fonte
Uma solução acima usando DigestUtils não funcionou para mim. Na minha versão do Apache commons (a mais recente para 2013) não existe tal classe.
Encontrei outra solução aqui em um blog . Ele funciona perfeitamente e não precisa de recursos comuns do Apache. Parece um pouco mais curto do que o código na resposta aceita acima.
Você precisará destas importações:
fonte
Esta é uma pequena variação das respostas de Andranik e Den Delimarsky acima, mas é um pouco mais conciso e não requer nenhuma lógica bit a bit. Em vez disso, ele usa o
String.format
método interno para converter os bytes em cadeias hexadecimais de dois caracteres (não tira 0's). Normalmente, eu apenas comentaria as respostas, mas não tenho reputação para fazer isso.Se você quiser retornar uma string minúscula, basta mudar
%02X
para%02x
.Edit: Usando BigInteger como com a resposta de wzbozon, você pode tornar a resposta ainda mais concisa:
fonte
Eu fiz uma biblioteca simples em Kotlin.
Adicionar na raiz build.gradle
em App build.gradle
Uso
Em Kotlin
Então use o método hash ()
Ele retornará MD5 e SHA-1 respectivamente.
Mais sobre a Biblioteca
https://github.com/ihimanshurawat/Hasher
fonte
Aqui está a versão Kotlin da resposta de @Andranik. Precisamos mudar
getBytes
paratoByteArray
(não é necessário adicionar charset UTF-8 porque o charset padrão detoByteArray
é UTF-8) e converter array [i] para inteiroEspero que ajude
fonte
MD5 é um pouco antigo, SHA-1 é um algoritmo melhor, há um exemplo aqui .
( Além disso, como eles observaram nessa postagem, Java trata disso por conta própria, sem código específico do Android. )
fonte
Em nosso aplicativo MVC, geramos para long param
e o mesmo no aplicativo Android (thenk ajuda Andranik)
fonte
Eu usei o método abaixo para me fornecer MD5 passando a string para a qual você deseja obter MD5
fonte
Use SHA-512, MD5 não é seguro
fonte
A conversão toHex () muito desperdiçadora prevalece em outras sugestões.
fonte
Isso está funcionando perfeitamente para mim, eu usei isso para obter MD5 no Array LIST (em seguida, convertê-lo em objeto JSON), mas se você só precisa aplicá-lo em seus dados. digite o formato, substitua JsonObject pelo seu.
Especialmente se você tiver uma incompatibilidade com a implementação do python MD5, use isso!
fonte
As soluções fornecidas para a linguagem Scala (um pouco mais curtas):
fonte