如何在 Ktor 中散列和验证密码?

Posted

技术标签:

【中文标题】如何在 Ktor 中散列和验证密码?【英文标题】:How to hash and verify passwords in Ktor? 【发布时间】:2020-06-06 16:31:01 【问题描述】:

我是 Kotlin 和 Ktor 的新手,当我尝试为我的 Web 应用程序实施身份验证时,我需要为用户存储密码。但是,我似乎无法通过 Ktor Core 或外部 java 依赖项找到一种方法来散列密码并验证它们。

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

有没有一种方法可以通过 Ktor 对密码进行哈希处理并进行验证? (类似于phppassword_hash()password_verify()) 如果没有,能否推荐一个信誉良好且维护良好的 Gradle 依赖项? 或者如何进行自定义实现并确保其安全?

【问题讨论】:

这是一个用于 bcrypt 的 Java 库:github.com/patrickfav/bcrypt。自述文件有很多关于如何正确使用它的信息。 【参考方案1】:

我曾这样使用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

【讨论】:

这似乎不适用于 wordpress,而是使用 PHPpass。 openwall.com/phpass 编译已过时,您应该改用实现【参考方案2】:

我用这个: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")

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

【讨论】:

以上是关于如何在 Ktor 中散列和验证密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 的 password_hash 来散列和验证密码

如何使用 PHP 的 password_hash 来散列和验证密码

如何在 Kotlin 的 Ktor 中提取访问权限验证

如何禁用 Ktor 客户端 SSL 验证?

来自 UserHashedTableAuth 的 Ktor 基本身份验证

Ktor websockets 身份验证