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