如何从 Java 创建 Meteor 密码?

How to create Meteor password from Java?

我正在尝试从 Java 代码生成有效的 Meteor 密码。

我知道 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());

这个 returns 字符串看起来像一个有效的 bcrypt 密码,但在我将它存储在 MongoDB 中并尝试从 Meteor 代码登录后,Meteor 不接受它。

我明白了。 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();
    }