【发布时间】:2019-01-06 22:55:21
【问题描述】:
我正在构建一个基本的身份验证设置,类似于它在 Vapor 的 auth-template 模板(来自 here)中的使用方式。我的所有设置都与模板中的方式相同。
但是,我想加盐。我可以在创建时为用户生成盐:
static func create(_ req: Request, newUserRequest user: CreateUserRequest) throws -> Future<User.Public> {
return User.query(on: req).filter(\.username == user.username).first().flatMap { existingUser in
guard existingUser == nil else {
throw Abort(.badRequest, reason: "A user with the given username already exists.")
}
guard user.password == user.passwordVerification else {
throw Abort(.badRequest, reason: "Given passwords did not match.")
}
let count = 16
var pw_salt_data = Data(count: count)
let _ = pw_salt_data.withUnsafeMutableBytes { mutableBytes in
SecRandomCopyBytes(kSecRandomDefault, count, mutableBytes)
}
let pw_salt = try BCrypt.hash(pw_salt_data.base64EncodedString())
let pw_hash = try BCrypt.hash(pw_salt + user.password)
return User(id: nil, username: user.username, pw_hash: pw_hash, pw_salt: pw_salt, email: user.email).save(on: req).toPublic()
}
}
但在登录期间执行身份验证时无法检索该盐:
static func login(_ req: Request) throws -> Future<UserToken> {
let user = try req.requireAuthenticated(User.self)
let token = try UserToken.create(userID: user.requireID())
return token.save(on: req)
}
我希望为每个用户随机生成盐,并将其作为与哈希密码分开的列存储在数据库中,以便稍后在身份验证期间使用。
是否有一种标准化的方法来处理在 Vapor 3 中对密码哈希进行加盐处理?
【问题讨论】: