J'ai pu modifier un jeton entre deux requêtes ! Comment cela est-il possible ?
Bonjour,
Pour un support de cours j'ai voulu montrer que la gestion de la sécurité via un token était très sûre et pour en donner la preuve, j'ai proposé de vérifier que l'on ne pouvait pas modifier un jeton.
Sauf que si j'ai pu modifier un jeton entre deux appels ! Comment cela est-il possible ?
D'abord un exemple :
Le token après un login :
Code:
1 2 3 4 5 6 7 8 9 10
| {
"id": 4,
"email": "jean.bon@monserveur.fr",
"password": "",
"username": "jean.bon",
"token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqZWFuLmJvbiIsImlhdCI6MTY0MzM4MDE1NSwiZXhwIjoxNjQzNDY2NTU1fQ.JUSTGCfWS9MrbBzkyEboaxHyZcBVwzC_TAH8LRx76wJmKZ9drF1cz51EWfKs9rd4GfxqwpE33-_5e0soylfA6w",
"roles": [
"USER"
]
} |
Résultat de la requête employee/employee avec ce token :
[{"id":1,"name":"KING","job":{"id":1,"jobname":"President"},"managerId":null,"hiredate":"1981-11-17","salary":5000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},{"id":2,"name":"JONES","job":{"id":2,"jobname":"Manager"},"managerId":1,"hiredate":"1981-04-02","salary":3000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},...
Token modifié : le dernier caractère (w) replacé par un x :
"token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqZWFuLmJvbiIsImlhdCI6MTY0MzM4MDE1NSwiZXhwIjoxNjQzNDY2NTU1fQ.JUSTGCfWS9MrbBzkyEboaxHyZcBVwzC_TAH8LRx76wJmKZ9drF1cz51EWfKs9rd4GfxqwpE33-_5e0soylfA6x",
Résultat de la requête employee/employee :
[{"id":1,"name":"KING","job":{"id":1,"jobname":"President"},"managerId":null,"hiredate":"1981-11-17","salary":5000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},{"id":2,"name":"JONES","job":{"id":2,"jobname":"Manager"},"managerId":1,"hiredate":"1981-04-02","salary":3000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},...
A noter que si je remplace le w par un caractère avant le w, par exemple un a ou b, cela ne fonctionne pas !
Maintenant le contexte technique :
La clé : key= AzertyuiopQsdfgjklmWxcvbn1234567890!=
Expiration : expiration= 86400000
Générateur de jeton :
Code:
1 2 3 4 5 6 7 8 9 10
| public String generateToken(Authentication authentication) {
UserDetailsImpl userDetailsImpl = (UserDetailsImpl) authentication.getPrincipal();
JwtBuilder jwtBuilder = Jwts.builder();
jwtBuilder.setSubject((userDetailsImpl.getUsername()));
jwtBuilder.setIssuedAt(new Date());
jwtBuilder.setExpiration(new Date((new Date()).getTime() + expiration));
jwtBuilder.signWith(SignatureAlgorithm.HS512, key);
String token = jwtBuilder.compact();
return token;
} |
Validateur de jeton :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| public boolean validateToken(String token) {
Boolean ret = false;
try {
JwtParser jwtParser = Jwts.parser();
jwtParser.setSigningKey(key);
jwtParser.parseClaimsJws(token);
ret= true;
} catch (Exception e) {
ret = false;
}
return ret;
} |
Extraction du username :
Code:
1 2 3 4 5 6 7 8
| public String getUserNameFromToken(String token) {
JwtParser jwtParser = Jwts.parser();
jwtParser.setSigningKey(key);
Jws<Claims> jws = jwtParser.parseClaimsJws(token);
Claims claims = jws.getBody();
String userName = claims.getSubject();
return userName;
} |