Хеши SHA-1, смешанные со строками - PullRequest
1 голос
/ 30 июня 2009

Мне нужно разобрать что-то вроде следующего «некоторый текстовый <40-байтовый хэш>». Могу ли я прочитать всю эту вещь в строку без повреждения 40-байтовой части хеша?

Дело в том, что хеша не будет, поэтому я не хочу обрабатывать его во время чтения.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что 40-байтовый хэш 2x20 байтов хэшей, без кодирования необработанных байтов.

Ответы [ 5 ]

1 голос
/ 02 июля 2009

Считайте его из вашего входного потока как поток байтов, а затем удалите строку из потока следующим образом:

String s = new String(Arrays.copyOfRange(bytes, 0, bytes.length-40));

Тогда получите ваши байты как:

byte[] hash = Arrays.copyOfRange(bytes, s.length-1, bytes.length-1)
0 голосов
/ 30 июня 2009

РАБОЧИЙ КОД: Преобразует входные данные байтовых строк в шестнадцатеричные символы, которые должны быть безопасными практически во всех строковых кодировках. Используйте код, который я написал в вашем другом вопросе, чтобы декодировать шестнадцатеричные символы обратно в необработанные байты.

/** Lookup table: character for a half-byte */
    static final char[] CHAR_FOR_BYTE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    /** Encode byte data as a hex string... hex chars are UPPERCASE */
    public static String encode(byte[] data){
        if(data == null || data.length==0){
            return null;
        }
        char[] store = new char[data.length*2];
        for(int i=0; i<data.length; i++){
            final int val = (data[i]&0xFF);
            final int charLoc=i<<1;
            store[charLoc]=CHAR_FOR_BYTE[val>>>4];
            store[charLoc+1]=CHAR_FOR_BYTE[val&0x0F];
        }
        return new String(store);
    }
0 голосов
/ 30 июня 2009

Некоторые подробности могут быть полезны, но я думаю, что ответ должен быть в порядке.

Вы не сказали, как был закодирован хэш SHA-1 (общие возможности включают «none» (необработанные байты), Base64 и hex). Поскольку SHA-1 создает 20-байтовый (160-битный) хэш, я предполагаю, что он будет закодирован с использованием шестнадцатеричного кода, поскольку это удваивает пространство, необходимое для упомянутых 40 байтов. При таком кодировании для кодирования каждого байта из хэша будут использоваться 2 символа, используя символы от 0 до 9 и от A до F. Все это символы ASCII, поэтому вы в безопасности.

Кодировка Base64 также будет работать (хотя, вероятно, не то, о чем вы спрашивали, так как она увеличивает размер примерно на 1/3, оставляя вас намного меньше 40 байт), поскольку каждый из символов, используемых в Base64, также является ASCII.

Если бы необработанные байты использовались напрямую, у вас возникла бы проблема, так как некоторые значения не были действительными символами.

0 голосов
/ 30 июня 2009

ОК, теперь, когда вы пояснили, что это необработанные байты

Нет, вы не можете прочитать это в Java как строку, вам нужно будет прочитать это как необработанные байты.

0 голосов
/ 30 июня 2009

Хэши SHA-1 имеют длину 20 байтов (160 бит). Если вы имеете дело с 40-ю символьными хешами, то они, вероятно, являются ASCII-представлением хеша и поэтому содержат только символы 0-9 и a-f. Если это так, то вы должны иметь возможность читать и манипулировать строками в Java без каких-либо проблем.

...