MD5 хеширование в Android - PullRequest
       16

MD5 хеширование в Android

85 голосов
/ 31 января 2011

У меня есть простой клиент Android, который должен «общаться» с простым слушателем C # HTTP.Я хочу обеспечить базовый уровень аутентификации, передавая имя пользователя / пароль в запросах POST.

Хеширование MD5 тривиально в C # и обеспечивает достаточную безопасность для моих нужд, но я не могу найти способ сделать этоконец андроида.

РЕДАКТИРОВАТЬ: Просто для решения проблем, связанных с слабостью MD5 - сервер C # работает на компьютерах пользователей моего клиента Android.Во многих случаях они будут получать доступ к серверу с помощью Wi-Fi в своих собственных локальных сетях, но на свой страх и риск они могут выбрать доступ к нему из Интернета.Также служба на сервере должна использовать сквозную передачу для MD5 для стороннего приложения, которое я не могу контролировать.

Ответы [ 14 ]

0 голосов
/ 16 апреля 2019

Пожалуйста, используйте SHA-512, MD5 небезопасно

public static String getSHA512SecurePassword(String passwordToHash) {
    String generatedPassword = null;
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update("everybreathyoutake".getBytes());
        byte[] bytes = md.digest(passwordToHash.getBytes());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
        }
        generatedPassword = sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return generatedPassword;
}
0 голосов
/ 25 марта 2016

Слишком расточительное преобразование toHex () преобладает в других предложениях.

private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();

public static String md5string(String s) {
    return toHex(md5plain(s));
}

public static byte[] md5plain(String s) {
    final String MD5 = "MD5";
    try {
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest.getInstance(MD5);
        digest.update(s.getBytes());
        return digest.digest();
    } catch (NoSuchAlgorithmException e) {
        // never happens
        e.printStackTrace();
        return null;
    }
}

public static String toHex(byte[] buf) {
    char[] hexChars = new char[buf.length * 2];
    int v;
    for (int i = 0; i < buf.length; i++) {
        v = buf[i] & 0xFF;
        hexChars[i * 2] = HEX_ARRAY[v >>> 4];
        hexChars[i * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars);
}
0 голосов
/ 11 июля 2014

Предлагаемые решения для языка Scala (немного короче):

def getMd5(content: Array[Byte]) =
    try {
        val md = MessageDigest.getInstance("MD5")
        val bytes = md.digest(content)
        bytes.map(b => Integer.toHexString((b + 0x100) % 0x100)).mkString
    } catch {
        case ex: Throwable => null
    }
0 голосов
/ 16 августа 2012

MD5 немного стар, SHA-1 - лучший алгоритм, здесь есть пример .

( Также, как отмечается в этом посте, Java обрабатывает это самостоятельно, без кода для Android. )

...