Сделать шифрование SHA1 на Android? - PullRequest
4 голосов
/ 22 апреля 2011

Можете ли вы предложить мне, как зашифровать строку с помощью алгоритма SHA1?Я искал об этом.Но не повезло.

Заранее спасибо.

Ответы [ 4 ]

9 голосов
/ 08 ноября 2011

Метод binnyb convertToHex не работает должным образом. Более правильный, который работает для меня:

private static String convertToHex(byte[] data) { 
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < data.length; i++) { 
        int halfbyte = (data[i] >>> 4) & 0x0F;
        int two_halfs = 0;
        do { 
            if ((0 <= halfbyte) && (halfbyte <= 9)) {
                buf.append((char) ('0' + halfbyte));
            }
            else {
                buf.append((char) ('a' + (halfbyte - 10)));
            }
            halfbyte = data[i] & 0x0F;
        } while(two_halfs++ < 1);
    } 
    return buf.toString();
} 


public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException  { 
    MessageDigest md = MessageDigest.getInstance("SHA-1");
    byte[] sha1hash = new byte[40];
    md.update(text.getBytes("iso-8859-1"), 0, text.length());
    sha1hash = md.digest();
    return convertToHex(sha1hash);
} 

используйте метод SHA1, чтобы получить строку sha1.

Обновление: предоставление полного ответа

2 голосов
/ 26 марта 2013

Я отвечал на это раньше ( Как SHA1 хэшировать строку в Android? ), но она подходит и здесь:

Android поставляется с кодеком Apache Commons Codec, так что вы можете простоиспользуйте следующую строку для создания шестнадцатеричной строки SHA-1:

String myHexHash = DigestUtils.shaHex(myFancyInput);

Это старый устаревший метод, который используется в Android 4 по умолчанию.В новых версиях DigestUtils представлены все разновидности методов shaHex (), таких как sha256Hex (), а также перегружены методы с различными типами аргументов.

Конечно, в DigestUtils и в остальном кодеке Commons больше функциональности.Просто взгляните.

http://commons.apache.org/proper/commons-codec//javadocs/api-release/org/apache/commons/codec/digest/DigestUtils.html

РЕДАКТИРОВАТЬ:

Если вы получите ClassNotFoundError, вам придется явно добавить commons-codec в качестве зависимости (даже если он должен прийтис Android в качестве переходной зависимости), в Maven, например:

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.7</version>
    </dependency>

А также вам придется изменить вызов на:

String myHexHash = new String(Hex.encodeHex(DigestUtils.sha512(myFancyInput)));

(мое скромное предположение, что это, вероятно,из-за проблемы ClassLoader (конфликт имен классов) в виртуальной машине Android - которая фактически доказывает, что классы общих кодеков уже присутствуют ...)

См. также: https://stackoverflow.com/a/9284092/621690

2 голосов
/ 22 апреля 2011

вот 2 метода, которые я нашел при поиске реализации алгоритма sha1:

private static String convertToHex(byte[] data) { 
    StringBuffer buf = new StringBuffer();
    int length = data.length;
    for(int i = 0; i < length; ++i) { 
        int halfbyte = (data[i] >>> 4) & 0x0F;
        int two_halfs = 0;
        do { 
            if((0 <= halfbyte) && (halfbyte <= 9)) 
                buf.append((char) ('0' + halfbyte));
            else 
                buf.append((char) ('a' + (halfbyte - 10)));
            halfbyte = data[i] & 0x0F;
        }
        while(++two_halfs < 1);
    } 
    return buf.toString();
}

public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException  { 
    MessageDigest md = MessageDigest.getInstance("SHA-1");
    byte[] sha1hash = new byte[40];
    md.update(text.getBytes("iso-8859-1"), 0, text.length());
    sha1hash = md.digest();
    return convertToHex(sha1hash);
} 

используйте метод SHA1, чтобы получить строку sha1. Я не подтвердил, что это действительно sha1, но он работает для моих приложений.

0 голосов
/ 29 августа 2012

binnyb поставил меня на правильный путь, но я нашел еще несколько, более понятный код здесь: http://www.coderanch.com/t/526487/java/java/Java-Byte-Hex-String

private static String convertToHex(byte[] data) {
    StringBuilder sb = new StringBuilder(data.length * 2);

    Formatter fmt = new Formatter(sb);
    for (byte b : data) {
        fmt.format("%02x", b);
    }

    return sb.toString();
}
...