2015-02-18 3 views
-1

Я хотел хэширования текст в Java "() _ | \ \} {] [/> <, ~`?.", После хеширования я получил "82101f0ba1cb0fd017e5b670b7475a95c831d016", но" ef89e75ce03a4fd9df7f9283d332d9a7f01fe09f ". Я искал хэши в Google для тестирования, и это было распространено почти на страницах. Я надеюсь, всегда использовать UTF-8 enter image description heresha1 ява хэширования неправильный результат

public abstract class PasswordHasher { 

protected String algorithm; 
protected MessageDigest md; 

protected PasswordHasher(String algorithm) { 
    try { 
     md = MessageDigest.getInstance(algorithm); 
    } catch (NoSuchAlgorithmException e) { 
     System.err.println("Operacja nieprzewidziana"); 
     throw new Error(); 
    } 
    this.algorithm = algorithm; 
} 

public String getAlgorithm() { return algorithm; } 

public String hashText(String text) { 
    StringBuilder sb = new StringBuilder(); 

    try { 
     md.update(text.getBytes("UTF8")); 
    } catch (Exception e) { 
     System.err.println("Null pointer or UTF8 does not exists"); 
     return null; 
    } 

    byte byteData[] = md.digest(); 

    for(byte b : byteData) 
     sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); 

    return sb.toString(); 
} } 

public class PasswordHasherSHA1 extends PasswordHasher { 

public PasswordHasherSHA1() { 
    super("SHA1"); 
} } 
+0

Notepad ++> NppCrypt (() _ | \} {] [? />. <,~') > 82101f0ba1cb0fd017e5b670b7475a95c831d016 что не так? (Не очень хорошо видно скриншот) – exoddus

+0

было \\ на самом деле, но нужно было перейти на \\\\, чтобы показать \\, thx для справки, кажется, что \ является проблема –

+1

Кажется, вы решили. Как вы можете понять, так как lo Как вы могли, вы не должны сохранять ваши хешируемые данные в строку. Прочитайте данные непосредственно в байт [], а затем вы избежите проблемы с \\ в объектах String. – exoddus

ответ

1

Можно ли использовать Apache Commons-кодек для этого? Всегда лучше использовать хорошо построенные библиотеки для такого рода вещей.

Если вы можете использовать commons-codec, это всего лишь одна строка для генерации SHA1-хэша для строки.

String sha1hash = DigestUtils.sha1Hex("()_ |\}{][?/>.<,~`"); 

Кроме того, вам нужно быть осторожным в символах '\' в ваших строках - это может рассматриваться как escape-последовательности.

+0

Thx, похоже, что \ это проблема и спасибо за библиотеку –

0

Прежде всего, ваш байт в шестнадцатеричной это странно:

Используйте этот один (там, вероятно, ничего быстрее):

private static final char[] CRYPTOCHARS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 

public static String byteArrayToHexString(final byte... args) 
{ 
    final char[] chars = new char[args.length * 2]; 
    for (int i = 0; i < args.length; i++) 
    { 
     chars[i * 2] = CRYPTOCHARS[(args[i] >> 4) & 0xF]; 
     chars[i * 2 + 1] = CRYPTOCHARS[(args[i]) & 0xF]; 
    } 
    return new String(chars); 
} 

или существующие библиотеки.

Вы должны сбросить md после/перед тем, как использовать его.

Я также получаю 82101f0ba1cb0fd017e5b670b7475a95c831d016 независимо от кодировки. Как вы выбираете другое значение? Некоторые библиотеки входа в систему шифруют пароль до 10000 раз.

Или это единичный тест, только неправильно?

+0

Теперь я вижу, не видел ее раньше, если вы смотрите на картинку, есть \\, \ проблема, спасибо за помощь. \\ изменить на \ в этом редакторе –

0

Вы должны либо неправильные данные испытаний или ваше предположение о фактическом истинном хэше неправилен:

$ echo -n '()_ |\}{][?/>.<,~`' | sha1sum - 
82101f0ba1cb0fd017e5b670b7475a95c831d016 - 

С двойной косой чертой:

$ echo -n '()_ |\\}{][?/>.<,~`' | sha1sum - 
ef89e75ce03a4fd9df7f9283d332d9a7f01fe09f - 
Смежные вопросы