在Ktor中如何对密码进行哈希和验证?

8

我刚开始接触Kotlin和Ktor,现在试图为我的Web应用程序实现身份验证时,需要存储用户密码。但是,我似乎找不到一种方法,无论是通过Ktor Core还是外部Java依赖项来散列密码并进行验证。

我发现了一些关于如何使用BCrypt或PBKDF2进行哈希的文章,但这些需要我自己实现哈希,这似乎不安全,因为我必须担心维护它。

  • 是否有一种通过Ktor可以对密码进行哈希并进行验证的方式?(类似于PHP的password_hash()password_verify()
  • 如果没有,您能推荐一个声誉良好、得到良好维护的Gradle依赖项吗?
  • 或者,我该如何制作自定义实现并确保其安全性?

2
这里有一个用于bcrypt的Java库:https://github.com/patrickfav/bcrypt。自述文件中有很多关于如何正确使用它的信息。 - Carson Graham
2个回答

4

我曾这样使用jBCrypt

在build.gradle添加如下内容:

// current jbcrypt_version is 0.4
compile group: 'org.mindrot', name: 'jbcrypt', version: jbcrypt_version

在创建用户数据库记录时,保存密码哈希值的方式如下:
import org.mindrot.jbcrypt.BCrypt
...
fun setPassword(user: User) {
   user.passwordHash = BCrypt.hashpw(password, BCrypt.gensalt())
}

在检查密码时:

user = findUserByUsername(username=usernameToCheck)
if (!user)
    return ...
if (!BCrypt.checkpw(user.passwordHash, passwordToCheck))
    return ...
// user/password validated

注意:jBCrypt盐以及一些元数据会与密码哈希值一起保存。例如:

salt=$2a$10$e9kAuRN/PARzXnNdnghiSO
hash=$2a$10$e9kAuRN/PARzXnNdnghiSOjfShrH9rrGQtfrAIj06LZ7ZW1MW7bEy

这似乎对使用PHP的WordPress无效,因为它使用PHPpass。https://www.openwall.com/phpass/ - Nicola Gallazzi
1
编译已经过时了,你应该使用实现代替。 - Jakub Matěna

0
我使用这个:https://github.com/patrickfav/bcrypt 我的使用方法:
get("/auth") {
        val password = "pardonme"
        val hashPassword = BCrypt.withDefaults().hashToString(12, password.toCharArray())
        val result = BCrypt.verifyer().verify(password.toCharArray(), hashPassword)
        // print it out and copy it, in case you want to test
        call.respondText("HashPassword: $hashPassword\nResult: $result")
}

然后你可以进行测试:

get("/auth") {
        val password = "pardonme"
        val hashPassword = "ur previous hashPassword"
        val result = BCrypt.verifyer().verify(password.toCharArray(), hashPassword)
        call.respondText("Result: $result")
}

您可以通过上面的链接查看更多信息!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接