-
Notifications
You must be signed in to change notification settings - Fork 894
chore: shorten provisioner key #14017
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,8 +3,6 @@ package provisionerkey | |
import ( | ||
"crypto/sha256" | ||
"crypto/subtle" | ||
"fmt" | ||
"strings" | ||
|
||
"github.com/google/uuid" | ||
"golang.org/x/xerrors" | ||
|
@@ -15,40 +13,31 @@ import ( | |
) | ||
|
||
func New(organizationID uuid.UUID, name string, tags map[string]string) (database.InsertProvisionerKeyParams, string, error) { | ||
id := uuid.New() | ||
secret, err := cryptorand.HexString(64) | ||
secret, err := cryptorand.String(64) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 64 is probably longer than we need if we are using alpha (lower & upper) + numbers. When we using hex strings, technically they are case insensitive, so you only get 16 options vs the now 62 (26 lower, 26 upper, 10 numeric) You only need ~43 characters to match the same search space as 64 hex characters. We only use 22 characters for our api keys (I bet we copied someone else here). It does not really matter, but if we are shortening our keys, we can at least shorten them to 43 and keep the same level of security as 64 hex characters. Which is super common.
Thoughts on going even shorter? 64 is such an excessive level of security. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Of course, I was leaning on better safe than sorry but let's go short - 32 sound good? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 32 is ~190 bits of entropy. 43 gets us to 256, which is common in symmetric key encryption. At the end of the day, 32 vs 43 feels completely arbitrary and probably sufficient, but 43 feels like "random" than "32" in the fact it lines up with 256bit. 🤷♂️ I don't think 43 looks too bad. That's just my 2c. 43 characters long
32
64
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 43 it is 😄 |
||
if err != nil { | ||
return database.InsertProvisionerKeyParams{}, "", xerrors.Errorf("generate token: %w", err) | ||
return database.InsertProvisionerKeyParams{}, "", xerrors.Errorf("generate secret: %w", err) | ||
} | ||
hashedSecret := HashSecret(secret) | ||
token := fmt.Sprintf("%s:%s", id, secret) | ||
|
||
if tags == nil { | ||
tags = map[string]string{} | ||
} | ||
|
||
return database.InsertProvisionerKeyParams{ | ||
ID: id, | ||
ID: uuid.New(), | ||
CreatedAt: dbtime.Now(), | ||
OrganizationID: organizationID, | ||
Name: name, | ||
HashedSecret: hashedSecret, | ||
HashedSecret: HashSecret(secret), | ||
Tags: tags, | ||
}, token, nil | ||
}, secret, nil | ||
} | ||
|
||
func Parse(token string) (uuid.UUID, string, error) { | ||
parts := strings.Split(token, ":") | ||
if len(parts) != 2 { | ||
return uuid.UUID{}, "", xerrors.Errorf("invalid token format") | ||
func Validate(token string) error { | ||
if len(token) != 64 { | ||
return xerrors.Errorf("must be 64 characters") | ||
} | ||
|
||
id, err := uuid.Parse(parts[0]) | ||
if err != nil { | ||
return uuid.UUID{}, "", xerrors.Errorf("parse id: %w", err) | ||
} | ||
|
||
return id, parts[1], nil | ||
return nil | ||
} | ||
|
||
func HashSecret(secret string) []byte { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
http.StatusBadGateway
? This should be unauthorized, no?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This error has a detail that specifies the length must be 64, and I thought it felt more like a 400 in that regard.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
omg I meant
StatusBadRequest
...