Manager: move worker password hasher into a struct + interface
Move the Worker password hashing/comparison functions into a struct, and use it via an interface. This will make it easier to switch to different hashing algorithms. Even with a low number of iterations, BCrypt is quite slow. That's good for security, but not for Flamenco Worker authentication -- the password is more as "nice check to avoid accidentally reusing the same ID" than something for security.
This commit is contained in:
parent
35fe0146d3
commit
0e4ed1c54d
@ -22,8 +22,28 @@ const (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
errAuthBad = errors.New("no such worker known")
|
errAuthBad = errors.New("no such worker known")
|
||||||
|
|
||||||
|
passwordHasher = BCryptHasher{}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type WorkerPasswordHasher interface {
|
||||||
|
GenerateHashedPassword(password []byte) ([]byte, error)
|
||||||
|
CompareHashAndPassword(hashedPassword, password []byte) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// BCryptHasher uses BCrypt to hash the worker passwords.
|
||||||
|
type BCryptHasher struct{}
|
||||||
|
|
||||||
|
func (h BCryptHasher) GenerateHashedPassword(password []byte) ([]byte, error) {
|
||||||
|
// The default BCrypt cost is made for important passwords. For Flamenco, the
|
||||||
|
// Worker password is not that important.
|
||||||
|
const bcryptCost = bcrypt.MinCost
|
||||||
|
return bcrypt.GenerateFromPassword(password, bcryptCost)
|
||||||
|
}
|
||||||
|
func (h BCryptHasher) CompareHashAndPassword(hashedPassword, password []byte) error {
|
||||||
|
return bcrypt.CompareHashAndPassword(hashedPassword, password)
|
||||||
|
}
|
||||||
|
|
||||||
// OpenAPI authentication function for authing workers.
|
// OpenAPI authentication function for authing workers.
|
||||||
// The worker will be fetched from the database and stored in the request context.
|
// The worker will be fetched from the database and stored in the request context.
|
||||||
func WorkerAuth(ctx context.Context, authInfo *openapi3filter.AuthenticationInput, persist PersistenceService) error {
|
func WorkerAuth(ctx context.Context, authInfo *openapi3filter.AuthenticationInput, persist PersistenceService) error {
|
||||||
@ -49,7 +69,7 @@ func WorkerAuth(ctx context.Context, authInfo *openapi3filter.AuthenticationInpu
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check the password.
|
// Check the password.
|
||||||
err = bcrypt.CompareHashAndPassword([]byte(hashedSecret), []byte(p))
|
err = passwordHasher.CompareHashAndPassword([]byte(hashedSecret), []byte(p))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn().Str("username", u).Msg("authentication error")
|
logger.Warn().Str("username", u).Msg("authentication error")
|
||||||
return authInfo.NewError(errAuthBad)
|
return authInfo.NewError(errAuthBad)
|
||||||
|
@ -13,7 +13,6 @@ import (
|
|||||||
|
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"golang.org/x/crypto/bcrypt"
|
|
||||||
|
|
||||||
"git.blender.org/flamenco/internal/manager/last_rendered"
|
"git.blender.org/flamenco/internal/manager/last_rendered"
|
||||||
"git.blender.org/flamenco/internal/manager/persistence"
|
"git.blender.org/flamenco/internal/manager/persistence"
|
||||||
@ -23,10 +22,6 @@ import (
|
|||||||
"git.blender.org/flamenco/pkg/api"
|
"git.blender.org/flamenco/pkg/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// The default BCrypt cost is made for important passwords. For Flamenco, the
|
|
||||||
// Worker password is not that important.
|
|
||||||
const bcryptCost = bcrypt.MinCost
|
|
||||||
|
|
||||||
// RegisterWorker registers a new worker and stores it in the database.
|
// RegisterWorker registers a new worker and stores it in the database.
|
||||||
func (f *Flamenco) RegisterWorker(e echo.Context) error {
|
func (f *Flamenco) RegisterWorker(e echo.Context) error {
|
||||||
logger := requestLogger(e)
|
logger := requestLogger(e)
|
||||||
@ -42,7 +37,7 @@ func (f *Flamenco) RegisterWorker(e echo.Context) error {
|
|||||||
|
|
||||||
logger.Info().Str("name", req.Name).Msg("registering new worker")
|
logger.Info().Str("name", req.Name).Msg("registering new worker")
|
||||||
|
|
||||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Secret), bcryptCost)
|
hashedPassword, err := passwordHasher.GenerateHashedPassword([]byte(req.Secret))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn().Err(err).Msg("error hashing worker password")
|
logger.Warn().Err(err).Msg("error hashing worker password")
|
||||||
return sendAPIError(e, http.StatusBadRequest, "error hashing password")
|
return sendAPIError(e, http.StatusBadRequest, "error hashing password")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user