Как создать Meteor пароль из Java? - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь сгенерировать действительный пароль Meteor из кода Java.

Я знаю, что Meteor использует bcrypt, и кажется, что он запускает хэш SHA-256 впереди.Но я не могу заставить это работать.Кто-нибудь там сделал это успешно?Я пробовал что-то вроде:

String password = "secret123";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
Charset scs = StandardCharsets.UTF_8;
//Charset scs = StandardCharsets.ISO_8859_1;
byte[] encodedhash = digest.digest(password.getBytes(scs));
String hash = new String(encodedhash, scs);
String bcrypt = BCrypt.hashpw(hash, BCrypt.gensalt());

Возвращает строку, которая выглядит как действительный пароль bcrypt, но Meteor не принимает ее после того, как я сохраню ее в MongoDB и попытаюсь войти из кода Meteor.

1 Ответ

1 голос
/ 09 апреля 2019

Я понял это. Двоичный результат SHA-256 должен быть отформатирован в строку шестнадцатеричных цифр.

Это рабочий код:

String password = "secret123";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
Charset scs = StandardCharsets.UTF_8;
byte[] encodedhash = digest.digest(password.getBytes(scs));
String hash = toHexString(encodedhash);
String bcrypt = BCrypt.hashpw(hash, BCrypt.gensalt());

С toHexString следующим образом:

    private static char toHex(int nibble) {
        final char[] hexDigit = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
        return hexDigit[nibble & 0xF];
    }
    public static String toHexString(byte[] bytes) {
        StringBuffer sb = new StringBuffer(bytes.length*2);
        for(int i = 0; i < bytes.length; i++) {
            sb.append(toHex(bytes[i] >> 4) );
            sb.append(toHex(bytes[i]) );
        }
        return sb.toString();
    }
...