-
Notifications
You must be signed in to change notification settings - Fork 31
Create rule S5659: JWT should be signed and verified with strong cipher algorithms for Go #4668
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
Merged
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
4a5c31e
Add go to rule S5659
daniel-teuchert-sonarsource fa22ba3
SONARGO-211: Add RSPEC for S5659 for Go
daniel-teuchert-sonarsource c932205
Improve code examples
daniel-teuchert-sonarsource 9524e7f
Update rules/S5659/go/rule.adoc
daniel-teuchert-sonarsource 8f8b571
Merge branch 'master' into rule/S5659-add-go
daniel-teuchert-sonarsource File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
{ | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
include::../summary.adoc[] | ||
|
||
== Why is this an issue? | ||
|
||
include::../rationale.adoc[] | ||
|
||
include::../impact.adoc[] | ||
|
||
== How to fix it | ||
|
||
=== Code examples | ||
|
||
==== Noncompliant code example | ||
|
||
The following example uses the `SigningMethodNone` method to sign a token. This method does not sign the token, which means that the token is not protected against tampering. | ||
|
||
[source,go,diff-id=1,diff-type=noncompliant] | ||
---- | ||
import ( | ||
jwt "github.com/golang-jwt/jwt/v5" | ||
) | ||
|
||
func signToken() { | ||
token := jwt.NewWithClaims(jwt.SigningMethodNone, | ||
jwt.MapClaims{ | ||
"foo": "bar", | ||
}) | ||
token.SignedString(jwt.UnsafeAllowNoneSignatureType) // Noncompliant | ||
} | ||
---- | ||
|
||
The following example uses the `UnsafeAllowNoneSignatureType` method to verify a token. This method does not verify the token, which means that the token is not protected against tampering. | ||
|
||
[source,go,diff-id=2,diff-type=noncompliant] | ||
---- | ||
import ( | ||
jwt "github.com/golang-jwt/jwt/v5" | ||
) | ||
|
||
func verifyToken(string tokenString) { | ||
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { | ||
return jwt.UnsafeAllowNoneSignatureType, nil // Noncompliant | ||
}) | ||
} | ||
---- | ||
|
||
==== Compliant solution | ||
|
||
The following example uses the `HS256` method to sign a token. This method signs the token using the HMAC algorithm with the secret key. | ||
|
||
[source,go,diff-id=1,diff-type=compliant] | ||
---- | ||
import ( | ||
jwt "github.com/golang-jwt/jwt/v5" | ||
) | ||
var hmacSecret = ... | ||
|
||
func signToken() { | ||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, | ||
jwt.MapClaims{ | ||
"foo": "bar", | ||
}) | ||
token.SignedString(hmacSecret) | ||
} | ||
---- | ||
|
||
The following example first checks that the signing method is HMAC and then returns the secret key to verify the token. | ||
|
||
[source,go,diff-id=2,diff-type=compliant] | ||
---- | ||
import ( | ||
jwt "github.com/golang-jwt/jwt/v5" | ||
) | ||
var hmacSecret = ... | ||
|
||
func verifyToken(string tokenString) { | ||
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { | ||
// Check the signing method | ||
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { | ||
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) | ||
} | ||
return hmacSecret, nil | ||
}) | ||
} | ||
---- | ||
|
||
=== How does this work? | ||
|
||
include::../common/fix/decode.adoc[] | ||
|
||
=== Going the extra mile | ||
|
||
include::../common/extra-mile/key-storage.adoc[] | ||
|
||
include::../common/extra-mile/key-rotation.adoc[] | ||
|
||
|
||
|
||
== Resources | ||
|
||
include::../common/resources/standards.adoc[] | ||
|
||
ifdef::env-github,rspecator-view[] | ||
|
||
''' | ||
== Implementation Specification | ||
(visible only on this page) | ||
|
||
include::../message.adoc[] | ||
|
||
endif::env-github,rspecator-view[] |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.