如何用Java创建流星密码?

时间:2019-04-09 10:11:57

标签: java meteor bcrypt

我正在尝试从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());

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

1 个答案:

答案 0 :(得分:1)

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