You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2022/12/12 14:33:38 UTC

[servicecomb-service-center] branch master updated: [feat]RBAC帐号password加密算法支持自定义扩展 (#1365)

This is an automated email from the ASF dual-hosted git repository.

littlecui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d4da67f [feat]RBAC帐号password加密算法支持自定义扩展 (#1365)
0d4da67f is described below

commit 0d4da67f6ba58c23c2fa4374ada4a12abc384491
Author: Sphairis <56...@users.noreply.github.com>
AuthorDate: Mon Dec 12 22:33:31 2022 +0800

    [feat]RBAC帐号password加密算法支持自定义扩展 (#1365)
    
    * extend password
    
    * fix error
    
    Co-authored-by: SphaIris <aaalixiaopei123>
---
 pkg/privacy/password.go      | 30 ++++++++++++++++++-----------
 pkg/privacy/password_test.go | 46 +++++++++++++++++---------------------------
 2 files changed, 37 insertions(+), 39 deletions(-)

diff --git a/pkg/privacy/password.go b/pkg/privacy/password.go
index b3c1fd5f..5c7936d7 100644
--- a/pkg/privacy/password.go
+++ b/pkg/privacy/password.go
@@ -21,7 +21,6 @@ import (
 	"strings"
 
 	scrypt "github.com/elithrar/simple-scrypt"
-	"github.com/go-chassis/foundation/stringutil"
 	"golang.org/x/crypto/bcrypt"
 
 	"github.com/apache/servicecomb-service-center/pkg/log"
@@ -33,23 +32,26 @@ const (
 
 var ScryptParams = scrypt.Params{N: 1024, R: 8, P: 1, SaltLen: 8, DKLen: 32}
 
-// HashPassword
-// Deprecated: use ScryptPassword, this is only for unit test to test compatible with old version
-func HashPassword(pwd string) (string, error) {
-	hash, err := bcrypt.GenerateFromPassword([]byte(pwd), 14)
-	if err != nil {
-		return "", err
-	}
-	return stringutil.Bytes2str(hash), nil
+// DefaultManager default manager
+var DefaultManager PasswordManager = &passwordManager{}
+
+type PasswordManager interface {
+	EncryptPassword(pwd string) (string, error)
+	CheckPassword(hashedPwd, pwd string) bool
 }
-func ScryptPassword(pwd string) (string, error) {
+
+type passwordManager struct {
+}
+
+func (p *passwordManager) EncryptPassword(pwd string) (string, error) {
 	hash, err := scrypt.GenerateFromPassword([]byte(pwd), ScryptParams)
 	if err != nil {
 		return "", err
 	}
 	return string(hash), nil
 }
-func SamePassword(hashedPwd, pwd string) bool {
+
+func (p *passwordManager) CheckPassword(hashedPwd, pwd string) bool {
 	if strings.HasPrefix(hashedPwd, algBcrypt) {
 		err := bcrypt.CompareHashAndPassword([]byte(hashedPwd), []byte(pwd))
 		if err == bcrypt.ErrMismatchedHashAndPassword {
@@ -62,5 +64,11 @@ func SamePassword(hashedPwd, pwd string) bool {
 		log.Warn("incorrect password attempts")
 	}
 	return err == nil
+}
 
+func ScryptPassword(pwd string) (string, error) {
+	return DefaultManager.EncryptPassword(pwd)
+}
+func SamePassword(hashedPwd, pwd string) bool {
+	return DefaultManager.CheckPassword(hashedPwd, pwd)
 }
diff --git a/pkg/privacy/password_test.go b/pkg/privacy/password_test.go
index c1e0fa20..e2a32514 100644
--- a/pkg/privacy/password_test.go
+++ b/pkg/privacy/password_test.go
@@ -23,42 +23,21 @@ import (
 
 	"github.com/apache/servicecomb-service-center/pkg/privacy"
 	scrypt "github.com/elithrar/simple-scrypt"
-	"github.com/go-chassis/foundation/stringutil"
 	"github.com/stretchr/testify/assert"
 	"golang.org/x/crypto/pbkdf2"
 )
 
-func TestHashPassword(t *testing.T) {
-	h, _ := privacy.HashPassword("test")
-	t.Log(h)
-	mac, _ := privacy.ScryptPassword("test")
-	t.Log(mac)
-
-	t.Run("given old hash result, should be compatible", func(t *testing.T) {
-		same := privacy.SamePassword(h, "test")
-		assert.True(t, same)
-	})
-
-	sameMac := privacy.SamePassword(mac, "test")
-	assert.True(t, sameMac)
+type mockPassword struct {
+}
 
-	t.Run("use different params for scrypt, should be compatible", func(t *testing.T) {
-		h2, _ := scrypt.GenerateFromPassword([]byte("test"), scrypt.Params{N: 1024, R: 8, P: 1, SaltLen: 8, DKLen: 32})
-		same := privacy.SamePassword(stringutil.Bytes2str(h2), "test")
-		assert.True(t, same)
-	})
+func (m mockPassword) EncryptPassword(pwd string) (string, error) {
+	return "encrypt password", nil
 }
-func BenchmarkBcrypt(b *testing.B) {
-	h, _ := privacy.HashPassword("test")
-	for i := 0; i < b.N; i++ {
-		same := privacy.SamePassword(h, "test")
-		if !same {
-			panic("")
-		}
 
-	}
-	b.ReportAllocs()
+func (m mockPassword) CheckPassword(hashedPwd, pwd string) bool {
+	return true
 }
+
 func BenchmarkScrypt(b *testing.B) {
 	h, _ := privacy.ScryptPassword("test")
 	for i := 0; i < b.N; i++ {
@@ -117,3 +96,14 @@ func BenchmarkPbkdf2(b *testing.B) {
 	})
 	b.ReportAllocs()
 }
+func TestDefaultManager(t *testing.T) {
+	currentManager := privacy.DefaultManager
+	privacy.DefaultManager = &mockPassword{}
+	defer func() {
+		privacy.DefaultManager = currentManager
+	}()
+	password, _ := privacy.DefaultManager.EncryptPassword("")
+	assert.Equal(t, "encrypt password", password)
+	samePassword := privacy.DefaultManager.CheckPassword("", "")
+	assert.True(t, samePassword)
+}