Любой способ имитировать шифрование пароля порта для Python? - PullRequest
0 голосов
/ 07 ноября 2018

В некоторых старых версиях Java для шифрования пароля используется пакет jasypt .
Он использует StrongPasswordEncryptor для шифрования паролей.

Похоже, использовать ниже, со страницы их документа
Алгоритм: SHA-256.
Размер соли: 16 байт.
Итерации: 100000.

Там исходный код показывает

 public StrongPasswordEncryptor() {
        super();
        this.digester = new StandardStringDigester();
        this.digester.setAlgorithm("SHA-256");
        this.digester.setIterations(100000);
        this.digester.setSaltSizeBytes(16);
        this.digester.initialize();
    }

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

У меня есть соль и пара простых текстовых паролей и зашифрованный пароль для проверки правильности работы порта Python, просто не знаю, какую библиотеку lib и какие функции шифровать. Пробовал hashlib.pbkdf2_hmac без удачи.

Пример простого текстового пароля: Testing123
Соль: 0DD2E486FAE5B121491CBE78A9B67AF1
Зашифрованный пароль: D1JAI76bwIkEkOIy7IZoLasAFKX0Yy7ujU/M7UBezC7NqxSD3clDyaFB1lz96K98

Вот фрагмент кода Java, который фактически шифрует пароль:

import javax.inject.Inject;
import javax.inject.Named;
import org.jasypt.util.password.StrongPasswordEncryptor;
import com.foobar.users.PasswordEncoder;

public class PasswordEncoderImpl implements PasswordEncoder {

    private String salt;
    private StrongPasswordEncryptor encryptor;

    @Inject
    public PasswordEncoderImpl(@Named("appHash") String appHash) {
        this.salt = appHash;
        encryptor = new StrongPasswordEncryptor();
    }

    @Override
    public String encode(String password) {
        return encryptor.encryptPassword(password + salt);
    }

    @Override
    public boolean verifyPassword(String password, String encryptedPassword){
        return encryptor.checkPassword(password+salt, encryptedPassword);
    }

}

1 Ответ

0 голосов
/ 07 ноября 2018

Хорошо, я получил половину решения на данный момент:

Вот упрощенный код Java, который проверяет, является ли данный пароль действительным:

private void start() throws Exception {

    String salt = "0DD2E486FAE5B121491CBE78A9B67AF1";
    String password = "Testing123";
    String previousResult = "QI2KU2VsI/aNr4U3XQ0AdaOk6Qhl4XTaN2ym5cYXxRr8tz/23EvWQHI8sNhRmoP1";

    StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
    String encryptedPass = passwordEncryptor.encryptPassword(password + salt);


    System.out.println(checkPass(salt, password, previousResult));
    System.out.println(passwordEncryptor.checkPassword(password + salt, previousResult));
}

private boolean checkPass(String salt, String password, String previousResult) throws NoSuchAlgorithmException {
    byte[] bytes = previousResult.getBytes(StandardCharsets.US_ASCII);
    byte[] decode = Base64.getDecoder().decode(bytes);

    byte[] secretSalt = new byte[16];
    System.arraycopy(decode, 0, secretSalt, 0, 16);

    byte [] message = (password + salt).getBytes(StandardCharsets.UTF_8);
    byte[] digest = digest(message, secretSalt);

    return Arrays.equals(digest, decode);
}


private byte[] digest(byte [] message, final byte[] salt) throws NoSuchAlgorithmException {

    byte[] digest;

    MessageDigest md = MessageDigest.getInstance("sha-256");
    md.reset();

    md.update(salt);
    md.update(message);


    digest = md.digest();
    for (int i = 0; i < (100000 - 1); i++) {
        md.reset();
        digest = md.digest(digest);
    }

    byte[] secondArray = digest;
    final byte[] result = new byte[salt.length + secondArray.length];

    System.arraycopy(salt, 0, result, 0, salt.length);
    System.arraycopy(secondArray, 0, result, salt.length, secondArray.length);

    return result;
}
...