Как разоблачить пароль, замаскированный командой Elytrons mask

Я использую WildFly и храню пароли в моем standalone.xml. В последнее время я начал хранить наши пароли в хранилище учетных данных. Пароль, используемый для доступа к этому хранилищу учетных данных, маскируется с помощью команды Elytron.bat mask. У WildFly нет проблем с использованием этого замаскированного пароля, но я также программно получаю доступ к хранилищам учетных данных, и здесь замаскированный пароль, похоже, не работает.

Я пытался использовать класс MaskedPassword и PasswordFactory. Однако классу MaskedPassword нужна переменная с именем initialKeyMaterial, о которой я не знаю.

Вот код, который я использую:

val passwordFactory = PasswordFactory.getInstance(MaskedPassword.ALGORITHM_MASKED_MD5_DES, new 
         WildFlyElytronPasswordProvider)

val rawPassword = MaskedPassword.createRaw(MaskedPassword.ALGORITHM_MASKED_MD5_DES, "keyMaterial".toCharArray, 25,
        "salt".toCharArray().map(_.toByte), "myPassword".toCharArray().map(_.toByte))

val unmaskedPassword = passwordFactory.translate(rawPassword)

person Chressin    schedule 04.10.2019    source источник


Ответы (2)


Исходный ключевой материал по умолчанию установлен на «какую-то произвольную сумасшедшую строку, которая не имеет значения». Вы должны указать это и использовать MaskedPassword

person Ashley Abdel-Sayed    schedule 17.10.2019
comment
Я должен был уточнить. Я пытался использовать эту строку, однако это не сработало. - person Chressin; 25.10.2019

Этот работал для меня.

public class MaskPassword
{
    static final Provider ELYTRON_PROVIDER = new WildFlyElytronProvider();

    public static void main(String[] args) throws Exception
    {
        String algorithm = "masked-MD5-DES";
        char[] keyMaterial = "somearbitrarycrazystringthatdoesnotmatter".toCharArray();
        byte[] salt = "12345678".getBytes();
        int iterationCount = 100;
        String clearPassword = "password1!";
        byte[] initializationVector = null;

        PasswordFactory passwordFactory = PasswordFactory.getInstance(algorithm, ELYTRON_PROVIDER);

        MaskedPasswordAlgorithmSpec maskedAlgorithmSpec = new MaskedPasswordAlgorithmSpec(
                keyMaterial, iterationCount, salt);
        EncryptablePasswordSpec encryptableSpec = new EncryptablePasswordSpec(
                clearPassword.toCharArray(), maskedAlgorithmSpec);

        MaskedPassword original = (MaskedPassword) passwordFactory
                .generatePassword(encryptableSpec);

        MaskedPasswordSpec maskedPasswordSpec = new MaskedPasswordSpec(keyMaterial, iterationCount,
                salt, original.getMaskedPasswordBytes());

        // Get the masked password as a string
        String maskedPassword = ByteIterator.ofBytes(maskedPasswordSpec.getMaskedPasswordBytes())
                .base64Encode().drainToString();
        System.out.println(String.format("Masked Password: " + maskedPassword));

        // Verify the masked password is the encryption of the clear password
        MaskedPassword restored = (MaskedPassword) passwordFactory
                .generatePassword(maskedPasswordSpec);
        System.out.println(String.format("Password Verified '%b'",
                passwordFactory.verify(restored, clearPassword.toCharArray())));

    }
}
person Nemo    schedule 06.05.2020