我正在尝试从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代码登录后不接受它。
答案 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();
}