От хеширования SHA к паролю - PullRequest
0 голосов
/ 03 марта 2019

Итак, я написал этот код для преобразования в хэш моего пароля, и теперь я хочу взять хеш и преобразовать его обратно в строку.как можно этого добиться?

package security;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashPassword {

    public static String hashPassword(String password) throws NoSuchAlgorithmException 
    {
        MessageDigest sha= MessageDigest.getInstance("SHA");
        sha.update(password.getBytes());
        byte [] b=sha.digest();
        StringBuffer sb= new StringBuffer();
        for(byte b1:b)
        {
            sb.append(Integer.toHexString(b1 & 0xff).toString());
        }

        return sb.toString();
    }
    public static void main(String[] args) 
    {
       String password="1234";
       System.out.println(password);
       try
       {
       System.out.println(hashPassword(password));
       }catch(NoSuchAlgorithmException e)
       {}
    }

}

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Весь смысл хэширования паролей заключается в достижении одной цели: сделать как можно более сложным получение исходного пароля из его хешированной версии.

В любом случае вам никогда не понадобится этот оригинальный пароль.Вы просто сохраняете хешированный (и соленый!) Пароль и всякий раз, когда вам нужно снова аутентифицировать пользователя, вы запрашиваете его пароль, хэшируете его и проверяете, соответствует ли он сохраненному хешированному паролю, который вы сохранили ранее.

Итак: хотя иногда можно получить пароль из его хеша, это просто то, что вас не волнует (если только вы не криптограф, который хочет оценить качество реализации хеширования).

0 голосов
/ 03 марта 2019

Как отмечали другие люди, хеш не предназначен для "преобразования" обратно в его первоначальное значение .Именно по этой причине хеши используются в базах данных для хранения паролей.С хэшем, который хранится в базе данных, даже если у меня есть доступ к базе данных, я не могу определить пароль, который там хранится.

Теперь, в зависимости от вашего использования хэша, вы можете попробовать несколько вещей:

1.
Вы просто хотите сделать пароль нечитаемым и читаемымчерез некоторое время
В этом случае вы можете использовать алгоритм шифрования и дешифрования, а не метод хэширования.Таким образом, вы можете вернуть исходное значение, если хотите.

Простой пример: https://www.thejavaprogrammer.com/caesar-cipher-java-encryption-decryption/
НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ШИФРОВАНИЕ ДЛЯ ХРАНЕНИЯ ПАРОЛЕЙ.

2.
Вы хотите внедрить службу / систему входа / регистрации, где вы храните пароль в виде хэша.
Если это то, что вы хотите, я бы предложил дружественный bcrypt: https://en.wikipedia.org/wiki/Bcrypt
Сегодняbcrypt - это стандарт для хеширования паролей и другой информации.Реализация Java также предлагает отличный способ проверить, соответствует ли введенный пароль сохраненному паролю.Таким образом, вам не нужно взламывать хэш в течение нескольких дней только для проверки пароля.

Java Реализация bcrypt может быть найдена здесь: http://www.mindrot.org/projects/jBCrypt/


0 голосов
/ 03 марта 2019

Вы можете попробовать взломать его с помощью Радужного стола

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...