java - 将 BCrypt 与 char[] 一起使用

标签 java security hash char bcrypt

大约几个小时前,我在 Stack Overflow 上询问了如何将 char[] 转换为 MD5 哈希值的方法。提供了一个解决方案,但被认为是不安全的 - 正如几个人所概述的:Generating an MD5 Hash with a char[]

Neil Smithline 建议我使用 BCrypt,但我无法将其与 char[] 一起使用。

我使用 char[] 来存储从登录表单检索到的密码的原因是 .getPassword() 仅支持 char[]。

        char[] passwordChars = passwordInputField.getPassword();
        String hashed = BCrypt.hashpw(passwordChars, BCrypt.gensalt(12));

目前,我正在尝试使用上面的代码生成哈希,但由于变量passwordCars的类型为char[],因此BCrypt.haspw()不支持它

现在我不使用常规字符串的唯一原因是它无法从内存中清除。

我现在的问题是 - 是否可以以某种方式将 char[] 与 BCrypt 一起使用?

提前致谢!

最佳答案

因此,基于 https://github.com/jeremyh/jBCrypt 中提出的实现,您需要更改 hashpwcheckpw 方法以接受 char[] 而不是 String

也许,最难的部分是在 hashpw...

    try {
        passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8");
    } catch (UnsupportedEncodingException uee) {
        throw new AssertionError("UTF-8 is not supported");
    }

最简单的解决方案是将 char[] 包装回 String,但我们试图避免这种情况。相反,基于 Converting char[] to byte[] 中的最高分答案,我们可以做一些更像...

    char[] expanded = password;
    if (minor >= 'a') {
        expanded = Arrays.copyOf(expanded, expanded.length + 1);
        expanded[expanded.length - 1] = '\000';
    }

    CharBuffer charBuffer = CharBuffer.wrap(expanded);
    ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer);
    passwordb = Arrays.copyOfRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit());

checkpw 方法实际上不需要任何修改(除了参数之外),因为它使用 hashpw 方法来检查结果。

所以,测试...

// We want the same salt for comparison
String salt = BCrypt.gensalt(12);
String original = BCrypt.hashpw("Testing", salt);
System.out.println(original);
String hash = BCrypt.hashpw("Testing".toCharArray(), salt);
System.out.println(hash);
System.out.println(BCrypt.checkpw("Testing", hash));
System.out.println(BCrypt.checkpw("Testing".toCharArray(), hash));

输出...

$2a$12$KclXlnca78yhcrg1/mNrRepLYqeJE//SRhrh1X3UM7YUQMjY4x8gy
$2a$12$KclXlnca78yhcrg1/mNrRepLYqeJE//SRhrh1X3UM7YUQMjY4x8gy
true
true

现在,如果您有 GitHub 帐户,您实际上可以克隆原始存储库,进行建议的更改并生成拉取请求。就我个人而言,我很想摆脱需要 String

checkpwhashpw 方法

我还发现了this PDKDF2 的实现,它使用 String,但随后立即将其转换为 char[] ...所以,改变起来非常简单...

关于java - 将 BCrypt 与 char[] 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30563048/

相关文章:

javascript - 如果我在 JS 中存储静态 session token 以便与 AJAX 一起使用,它是否可以安全地抵御 CSRF?

java - dockerize java 应用程序的方法

java - 在 Mac 和 Windows 上部署 LWJGL 应用程序

java - org.eclipse.swt.widgets.TableColumn atPosition(x,y)

ruby-on-rails - 将散列更改为数组

python - 多处理?多线程?水池?队列?暴力破解

c# - JavaScript 中的 SHA256Cng

Java服务器套接字: Find an open port NOT blocked by a firewall

macos - 如何创建 Mac OS 应用程序的内存转储

javascript - 如果 XSS 攻击得到缓解,Aurelia 中是否可能存在 CSRF?