Ich habe einen einfachen Android-Client, der mit einem einfachen C # HTTP-Listener "sprechen" muss. Ich möchte eine grundlegende Authentifizierungsstufe bereitstellen, indem ich Benutzername / Passwort in POST-Anfragen übergebe.
MD5-Hashing ist in C # trivial und bietet genügend Sicherheit für meine Anforderungen, aber ich kann anscheinend nicht finden, wie dies am Android-Ende zu tun ist.
BEARBEITEN: Nur um die Bedenken bezüglich der MD5-Schwäche auszuräumen - der C # -Server läuft auf den PCs der Benutzer meines Android-Clients. In vielen Fällen greifen sie über WLAN in ihren eigenen LANs auf den Server zu, können jedoch auf eigenes Risiko über das Internet darauf zugreifen. Außerdem muss der Dienst auf dem Server das Pass-Through für das MD5 an eine Drittanbieteranwendung verwenden, über die ich keine Kontrolle habe.
quelle
Antworten:
Hier ist eine Implementierung, die Sie verwenden können (aktualisiert, um aktuellere Java-Konventionen zu verwenden -
for:each
SchleifeStringBuilder
anstelle vonStringBuffer
):Obwohl es nicht für Systeme empfohlen wird, die selbst die grundlegende Sicherheitsstufe beinhalten (MD5 gilt als defekt und kann leicht ausgenutzt werden ), reicht es manchmal für grundlegende Aufgaben aus.
quelle
NoSuchAlgorithmException
)?Die akzeptierte Antwort hat bei Android 2.2 nicht funktioniert. Ich weiß nicht warum, aber es "aß" einige meiner Nullen (0). Apache Commons funktionierte auch unter Android 2.2 nicht, da Methoden verwendet werden, die nur ab Android 2.3.x unterstützt werden. Wenn Sie nur einen MD5-String verwenden möchten, ist Apache Commons dafür zu komplex. Warum sollte man eine ganze Bibliothek behalten, um nur eine kleine Funktion daraus zu verwenden ...
Schließlich habe ich hier das folgende Code-Snippet gefunden, das für mich perfekt funktioniert hat. Ich hoffe, es wird für jemanden nützlich sein ...
quelle
Der androidsnippets.com-Code funktioniert nicht zuverlässig, da Nullen aus dem resultierenden Hash herausgeschnitten zu sein scheinen.
Eine bessere Umsetzung ist hier .
quelle
Wenn die Verwendung von Apache Commons Codec eine Option ist, ist dies eine kürzere Implementierung:
Oder SHA:
Quelle für oben.
Bitte folgen Sie dem Link und stimmen Sie seiner Lösung zu, um die richtige Person zu bestimmen.
Maven-Repo-Link: https://mvnrepository.com/artifact/commons-codec/commons-codec
Aktuelle Maven-Abhängigkeit (Stand 6. Juli 2016):
quelle
Eine der oben genannten Lösungen mit DigestUtils hat bei mir nicht funktioniert. In meiner Version von Apache Commons (die neueste für 2013) gibt es keine solche Klasse.
Ich habe hier in einem Blog eine andere Lösung gefunden . Es funktioniert perfekt und benötigt keine Apache Commons. Es sieht etwas kürzer aus als der Code in der oben akzeptierten Antwort.
Sie benötigen diese Importe:
quelle
Dies ist eine geringfügige Variation der obigen Antworten von Andranik und Den Delimarsky, aber etwas prägnanter und erfordert keine bitweise Logik. Stattdessen wird die integrierte
String.format
Methode verwendet, um die Bytes in hexadezimale Zeichenfolgen mit zwei Zeichen umzuwandeln (keine Nullen werden entfernt). Normalerweise würde ich nur ihre Antworten kommentieren, aber ich habe nicht den Ruf, dies zu tun.Wenn Sie stattdessen eine Zeichenfolge in Kleinbuchstaben zurückgeben möchten, wechseln Sie einfach
%02X
zu%02x
.Bearbeiten: Wenn Sie BigInteger wie bei der Antwort von wzbozon verwenden, können Sie die Antwort noch präziser gestalten:
quelle
Ich habe eine einfache Bibliothek in Kotlin erstellt.
Fügen Sie bei Root build.gradle hinzu
bei App build.gradle
Verwendung
In Kotlin
Verwenden Sie dann die Methode hash ()
Es werden jeweils MD5 und SHA-1 zurückgegeben.
Mehr über die Bibliothek
https://github.com/ihimanshurawat/Hasher
quelle
Hier ist Kotlin Version von @Andranik Antwort. Wir müssen Veränderung
getBytes
zutoByteArray
(brauche nicht charset UTF-8 , da der Standard - Zeichensatz von hinzuzufügentoByteArray
ist UTF-8) und Guss array [i] zu integerHoffe es hilft
quelle
MD5 ist etwas alt, SHA-1 ist ein besserer Algorithmus, hier gibt es ein Beispiel .
( Wie in diesem Beitrag erwähnt, erledigt Java dies selbstständig, ohne Android-spezifischen Code. )
quelle
In unserer MVC-Anwendung generieren wir für lange Parameter
und das gleiche in der Android-Anwendung (thenk hilft Andranik)
quelle
Ich habe die folgende Methode verwendet, um mir MD5 zu geben, indem ich einen String übergebe, für den Sie MD5 erhalten möchten
quelle
Bitte verwenden Sie SHA-512, MD5 ist unsicher
quelle
In anderen Vorschlägen herrscht tatsächlich eine viel zu verschwenderische toHex () - Konvertierung vor.
quelle
Dies funktioniert perfekt für mich. Ich habe dies verwendet, um MD5 auf dem LIST-Array abzurufen (und es dann in ein JSON-Objekt zu konvertieren), aber wenn Sie es nur auf Ihre Daten anwenden müssen. Geben Sie das Format ein und ersetzen Sie JsonObject durch Ihr Format.
Dies gilt insbesondere dann, wenn Sie mit der Python MD5-Implementierung nicht übereinstimmen.
quelle
Die bereitgestellten Lösungen für die Scala-Sprache (etwas kürzer):
quelle