mirror of https://github.com/rocboss/paopao-ce
parent
859da55cba
commit
2631db9186
@ -0,0 +1,27 @@
|
||||
// Copyright 2024 ROC. All rights reserved.
|
||||
// Use of this source code is governed by a MIT style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package conf
|
||||
|
||||
import (
|
||||
"github.com/alimy/tryst/cfg"
|
||||
"github.com/rocboss/paopao-ce/pkg/auth"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
func NewPasswordProvider() (provider auth.PasswordProvider) {
|
||||
cfg.On(cfg.Actions{
|
||||
"Md5AuthMethod": func() {
|
||||
provider = auth.NewMd5PasswordProvider()
|
||||
},
|
||||
"BcryptAuthMethod": func() {
|
||||
provider = auth.NewBcryptPasswordProvider(bcrypt.DefaultCost)
|
||||
},
|
||||
},
|
||||
func() {
|
||||
provider = auth.NewMd5PasswordProvider()
|
||||
},
|
||||
)
|
||||
return
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
// Copyright 2024 ROC. All rights reserved.
|
||||
// Use of this source code is governed by a MIT style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package auth
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"github.com/gofrs/uuid/v5"
|
||||
"github.com/rocboss/paopao-ce/pkg/utils"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type PasswordProvider interface {
|
||||
Generate(password string) (string, error)
|
||||
Compare(hashedPassword, password string) error
|
||||
}
|
||||
|
||||
type bcryptPasswordProvider struct {
|
||||
cost int
|
||||
}
|
||||
|
||||
type md5PasswordProvider struct{}
|
||||
|
||||
func (p *bcryptPasswordProvider) Generate(password string) (string, error) {
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), p.cost)
|
||||
return utils.String(hashedPassword), err
|
||||
}
|
||||
|
||||
func (p *bcryptPasswordProvider) Compare(hashedPassword, password string) error {
|
||||
return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
|
||||
}
|
||||
|
||||
func (p md5PasswordProvider) Generate(password string) (string, error) {
|
||||
salt := uuid.Must(uuid.NewV4()).String()[:8]
|
||||
return utils.EncodeMD5(utils.EncodeMD5(password)+salt) + ":" + salt, nil
|
||||
}
|
||||
|
||||
func (p md5PasswordProvider) Compare(hashedPassword, password string) error {
|
||||
passwordSalt := strings.Split(string(hashedPassword), ":")
|
||||
if len(passwordSalt) != 2 {
|
||||
return errors.New("invalid hashed password")
|
||||
}
|
||||
if strings.Compare(passwordSalt[0], utils.EncodeMD5(utils.EncodeMD5(password)+passwordSalt[1])) != 0 {
|
||||
return errors.New("invalid password")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewBcryptPasswordProvider(cost int) PasswordProvider {
|
||||
return &bcryptPasswordProvider{
|
||||
cost: cost,
|
||||
}
|
||||
}
|
||||
|
||||
func NewMd5PasswordProvider() PasswordProvider {
|
||||
return md5PasswordProvider{}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
// Copyright 2024 ROC. All rights reserved.
|
||||
// Use of this source code is governed by a MIT style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package types
|
||||
|
||||
import (
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type PasswordProvider interface {
|
||||
Generate(password []byte) ([]byte, error)
|
||||
Compare(hashedPassword, password []byte) error
|
||||
}
|
||||
|
||||
func NewBcryptPasswordProvider(cost int) PasswordProvider {
|
||||
return &bcryptPasswordProvider{
|
||||
cost: cost,
|
||||
}
|
||||
}
|
||||
|
||||
type bcryptPasswordProvider struct {
|
||||
cost int
|
||||
}
|
||||
|
||||
func (p *bcryptPasswordProvider) Generate(password []byte) ([]byte, error) {
|
||||
return bcrypt.GenerateFromPassword(password, p.cost)
|
||||
}
|
||||
|
||||
func (p *bcryptPasswordProvider) Compare(hashedPassword, password []byte) error {
|
||||
return bcrypt.CompareHashAndPassword(hashedPassword, password)
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
ALTER TABLE `p_user` ADD COLUMN `salt` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '盐值';
|
||||
|
||||
UPDATE
|
||||
`p_user`
|
||||
SET
|
||||
`salt` = SUBSTRING_INDEX(`password`, ':', -1),
|
||||
`password` = SUBSTRING_INDEX(`password`, ':', 1);
|
||||
|
||||
ALTER TABLE `p_user` MODIFY COLUMN `password` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '密码';
|
@ -0,0 +1,8 @@
|
||||
ALTER TABLE `p_user` MODIFY COLUMN `password` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '密码';
|
||||
|
||||
UPDATE
|
||||
p_user
|
||||
SET
|
||||
password = CONCAT_WS(':', password, salt);
|
||||
|
||||
ALTER TABLE `p_user` DROP COLUMN `salt`;
|
@ -0,0 +1,12 @@
|
||||
ALTER TABLE p_user ADD COLUMN salt VARCHAR(32) NOT NULL DEFAULT '';
|
||||
|
||||
UPDATE
|
||||
p_user
|
||||
SET
|
||||
salt = split_part(password, ':', -1),
|
||||
password = split_part(password, ':', 1);
|
||||
|
||||
ALTER TABLE p_user
|
||||
ALTER COLUMN password TYPE VARCHAR(64),
|
||||
ALTER COLUMN password SET NOT NULL,
|
||||
ALTER COLUMN password SET DEFAULT '';
|
@ -0,0 +1,11 @@
|
||||
ALTER TABLE p_user
|
||||
ALTER COLUMN password TYPE VARCHAR(255)
|
||||
ALTER COLUMN password SET NOT NULL
|
||||
ALTER COLUMN password SET DEFAULT '';
|
||||
|
||||
UPDATE
|
||||
p_user
|
||||
SET
|
||||
password = concat_ws(':', password, salt);
|
||||
|
||||
ALTER TABLE p_user DROP COLUMN salt;
|
@ -0,0 +1,11 @@
|
||||
ALTER TABLE p_user ADD COLUMN salt text(32) NOT NULL DEFAULT '';
|
||||
ALTER TABLE p_user ADD COLUMN password_copy text(64) NOT NULL DEFAULT '';
|
||||
|
||||
UPDATE
|
||||
p_user
|
||||
SET
|
||||
salt = substr(password, instr(password, ':')+1),
|
||||
password_copy = substr(password, 1, instr(password, ':')-1);
|
||||
|
||||
ALTER TABLE p_user DROP COLUMN password;
|
||||
ALTER TABLE p_user RERENAME COLUMN password_copy TO password;
|
@ -0,0 +1,5 @@
|
||||
ALTER TABLE p_user ADD COLUMN password_copy text(255) NOT NULL DEFAULT '';
|
||||
UPDATE p_user SET password_copy = concat_ws(':', password, salt);
|
||||
ALTER TABLE p_user DROP COLUMN password;
|
||||
ALTER TABLE p_user RERENAME COLUMN password_copy TO password;
|
||||
ALTER TABLE p_user DROP COLUMN salt;
|
Loading…
Reference in new issue