SlideShare une entreprise Scribd logo
1  sur  126
Télécharger pour lire hors ligne
Cracking JWT tokensCracking JWT tokens
a tale ofa tale of magicmagic,, Node.jsNode.js andand parallel computingparallel computing
Oslo - 5 JUN 2018
Luciano Mammino (Luciano Mammino ( ))@loige@loige
loige.link/jwt-crack-oslo 1
loige.link/jwt-crack-oslo
2
Luciano... who?Luciano... who?
Visit my castles:
-  (@loige)
-  (lmammino)
-
-  (loige.co)
Twitter
GitHub
Linkedin
Blog
Solution Architect at
with @mariocasciaro
with @andreaman87
with @ Podgeypoos79 3
Based on prior workBased on prior work
Chapters 10 & 11 in (book)
2-parts article on RisingStack:
   " "
Node.js design patterns
ZeroMQ & Node.js Tutorial - Cracking JWT Tokens
github.com/lmammino/jwt-cracker
github.com/lmammino/distributed-jwt-cracker
4
AgendaAgenda
What's JWTWhat's JWT
How it worksHow it works
Testing JWT tokensTesting JWT tokens
Brute-forcing a token!Brute-forcing a token!
5
  — RFC 7519— RFC 7519
 
is a compact, URL-safe means of representing claims to be
transferred between two parties. The claims in a JWT are
encoded as a JSON object that is used as the payload of a JSON
Web Signature (JWS) structure or as the plaintext of a JSON
Web Encryption (JWE) structure, enabling the claims to be
digitally signed or integrity protected with a Message
Authentication Code (MAC) and/or encrypted.
JSON Web Token (JWT)JSON Web Token (JWT)
6
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZX
NzYWdlIjoiaGVsbG8gcGVvcGxlIn0.II7XQbjvDCNzYWdlIjoiaGVsbG8gcGVvcGxlIn0.II7XQbjvDC
Hkt3UOh6weHY6tRcemT0gxRVmA6W6uZ8AHkt3UOh6weHY6tRcemT0gxRVmA6W6uZ8A
7
OKOK
Let's try to make itLet's try to make it
simpler...simpler...
8
JWT is...
An URL safe, stateless protocol
for transferring claims
9
10
URL safe?
10
URL safe?
stateless?
10
URL safe?
stateless?
claims?
10
URL Safe...URL Safe...
It's a string that can be safely used as part of a URLIt's a string that can be safely used as part of a URL
(it doesn't contain URL separators like "(it doesn't contain URL separators like "==", "", "//", "", "##" or "" or "??")")
unicorntube.pl/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
11
Stateless?Stateless?
Token validity can be verified without having to interrogate aToken validity can be verified without having to interrogate a
third-party servicethird-party service
(Sometimes also defined as "self-contained")
12
What is a claim?What is a claim?
13
some information to transfersome information to transfer
identityidentity (login session)(login session)
authorisation to perform actionsauthorisation to perform actions (api key)(api key)
ownershipownership (a ticket belongs to somebody)(a ticket belongs to somebody)
14
also...also...
validity constraintsvalidity constraints
token time constraintstoken time constraints (dont' use before/after)(dont' use before/after)
audienceaudience (a ticket only for a specific concert)(a ticket only for a specific concert)
issuer identityissuer identity (a ticket issued by a specific reseller)(a ticket issued by a specific reseller)
15
also...also...
protocol informationprotocol information
Type of tokenType of token
AlgorithmAlgorithm
16
In generalIn general
All the bits of information transferred with the tokenAll the bits of information transferred with the token
17
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZX
NzYWdlIjoiaGVsbG8gcGVvcGxlIn0.II7XQbjvDCNzYWdlIjoiaGVsbG8gcGVvcGxlIn0.II7XQbjvDC
Hkt3UOh6weHY6tRcemT0gxRVmA6W6uZ8AHkt3UOh6weHY6tRcemT0gxRVmA6W6uZ8A
18
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..eyJtZXeyJtZX
NzYWdlIjoiaGVsbG8gcGVvcGxlIn0NzYWdlIjoiaGVsbG8gcGVvcGxlIn0..II7XQbjvDCII7XQbjvDC
Hkt3UOh6weHY6tRcemT0gxRVmA6W6uZ8AHkt3UOh6weHY6tRcemT0gxRVmA6W6uZ8A
3 parts3 parts
separated by "."separated by "."
19
20
HEADERHEADER::
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpeyJhbGciOiJIUzI1NiIsInR5cCI6Ikp
XVCJ9XVCJ9
20
HEADERHEADER::
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpeyJhbGciOiJIUzI1NiIsInR5cCI6Ikp
XVCJ9XVCJ9
PAYLOADPAYLOAD::
eyJtZXNzYWdlIjoiaGVsbG8gcGVvceyJtZXNzYWdlIjoiaGVsbG8gcGVvc
GxlIn0GxlIn0
20
HEADERHEADER::
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpeyJhbGciOiJIUzI1NiIsInR5cCI6Ikp
XVCJ9XVCJ9
PAYLOADPAYLOAD::
eyJtZXNzYWdlIjoiaGVsbG8gcGVvceyJtZXNzYWdlIjoiaGVsbG8gcGVvc
GxlIn0GxlIn0
SIGNATURESIGNATURE::
II7XQbjvDCHkt3UOh6weHY6tRcemII7XQbjvDCHkt3UOh6weHY6tRcem
T0gxRVmA6W6uZ8AT0gxRVmA6W6uZ8A 20
HeaderHeader andand PayloadPayload areare
encodedencoded
let's decode them!let's decode them!
Base64UrlBase64Url
21
22
HEADERHEADER::
22
HEADERHEADER::
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
22
HEADERHEADER::
{"alg":"HS256","typ":"JWT"}{"alg":"HS256","typ":"JWT"}
22
HEADERHEADER::
PAYLOADPAYLOAD::
{"alg":"HS256","typ":"JWT"}{"alg":"HS256","typ":"JWT"}
22
HEADERHEADER::
PAYLOADPAYLOAD::
{"alg":"HS256","typ":"JWT"}{"alg":"HS256","typ":"JWT"}
eyJtZXNzYWdlIjoiaGVsbG8gcGVvceyJtZXNzYWdlIjoiaGVsbG8gcGVvc
GxlIn0GxlIn0
22
HEADERHEADER::
PAYLOADPAYLOAD::
{"alg":"HS256","typ":"JWT"}{"alg":"HS256","typ":"JWT"}
{"message":"hello people"}{"message":"hello people"}
22
HEADERHEADER::
The decoded info is JSON!The decoded info is JSON!
PAYLOADPAYLOAD::
{"alg":"HS256","typ":"JWT"}{"alg":"HS256","typ":"JWT"}
{"message":"hello people"}{"message":"hello people"}
22
HEADERHEADER::
{"alg":"HS256","typ":"JWT"}{"alg":"HS256","typ":"JWT"}
alg:alg: the kind of algorithm usedthe kind of algorithm used
"HS256""HS256" HMACSHA256 SignatureHMACSHA256 Signature (secret based hashing)(secret based hashing)
""RS256RS256" RSASHA256 Signature" RSASHA256 Signature (public/private key hashing)(public/private key hashing)
""nonenone" NO SIGNATURE!" NO SIGNATURE! (This is " (This is " ")")infamousinfamous
23
PAYLOADPAYLOAD::
{"message":"hello people"}{"message":"hello people"}
  
Payload can be anything thatPayload can be anything that
you can express in JSONyou can express in JSON
24
PAYLOADPAYLOAD::
"registered" (or standard) claims:"registered" (or standard) claims:
iss: issuer ID ("auth0")
sub: subject ID ("johndoe@gmail.com")
aud: audience ID ("https://someapp.com")
exp: expiration time ("1510047437793")
nbf: not before ("1510046471284")
iat: issue time ("1510045471284")
25
PAYLOADPAYLOAD::
"registered" (or standard) claims:"registered" (or standard) claims:
{ 
  "iss": "auth0", 
  "sub": "johndoe@gmail.com", 
  "aud": "https://someapp.com", 
  "exp": "1510047437793", 
  "nbf": "1510046471284", 
  "iat": "1510045471284" 
}
26
So far it's just metadata...So far it's just metadata...
What makes it safe?What makes it safe?
27
SIGNATURESIGNATURE::
II7XQbjvDCHkt3UOh6weHY6II7XQbjvDCHkt3UOh6weHY6
tRcemT0gxRVmA6W6uZ8AtRcemT0gxRVmA6W6uZ8A
  
AA Base64URLBase64URL encodedencoded cryptographiccryptographic
signaturesignature of the header and the payloadof the header and the payload
28
With HS256With HS256
signature = HMACSHA256( 
  base64UrlEncode(header) + "." + 
    base64UrlEncode(payload), 
  secret 
)
header payload secret SIGNATURE+ + =
29
If a system knows theIf a system knows the secretsecret
It can verify the authenticityIt can verify the authenticity
of the tokenof the token
With HS256With HS256
30
Let's create a token from scratchLet's create a token from scratch
runkit.com/lmammino/create-jwt-token
31
Playground for JWTPlayground for JWT
JWT.ioJWT.io
32
An exampleAn example
Session token
33
Classic implementationClassic implementation
cookie/session basedcookie/session based
34
35
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
user:"luciano" 
pass:"mariobros"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
2. generate session
id:"Y4sHySEPWAjc" 
user:"luciano"
user:"luciano" 
pass:"mariobros"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
id:"Y4sHySEPWAjc" 
user:"luciano"
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
2. generate session
id:"Y4sHySEPWAjc" 
user:"luciano"
user:"luciano" 
pass:"mariobros"
3. session cookie
SID:"Y4sHySEPWAjc" 
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
id:"Y4sHySEPWAjc" 
user:"luciano"
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
2. generate session
id:"Y4sHySEPWAjc" 
user:"luciano"
user:"luciano" 
pass:"mariobros"
3. session cookie
SID:"Y4sHySEPWAjc" 
4. GET /profile
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
id:"Y4sHySEPWAjc" 
user:"luciano"SID:"Y4sHySEPWAjc" 
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
2. generate session
id:"Y4sHySEPWAjc" 
user:"luciano"
user:"luciano" 
pass:"mariobros"
3. session cookie
SID:"Y4sHySEPWAjc" 
4. GET /profile
5. query
id:"Y4sHySEPWAjc" 
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
id:"Y4sHySEPWAjc" 
user:"luciano"SID:"Y4sHySEPWAjc" 
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
2. generate session
id:"Y4sHySEPWAjc" 
user:"luciano"
user:"luciano" 
pass:"mariobros"
3. session cookie
SID:"Y4sHySEPWAjc" 
4. GET /profile
5. query
id:"Y4sHySEPWAjc" 
6. record
id:"Y4sHySEPWAjc" 
user:"luciano"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
id:"Y4sHySEPWAjc" 
user:"luciano"SID:"Y4sHySEPWAjc" 
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
2. generate session
id:"Y4sHySEPWAjc" 
user:"luciano"
user:"luciano" 
pass:"mariobros"
3. session cookie
SID:"Y4sHySEPWAjc" 
4. GET /profile
5. query
id:"Y4sHySEPWAjc" 
6. record
id:"Y4sHySEPWAjc" 
user:"luciano"
7. (page)
<h1>hello luciano</h1>
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
35
 
 
 
 
 
 
Sessions
Database
 
 
 
 
 
 
id:"Y4sHySEPWAjc" 
user:"luciano"SID:"Y4sHySEPWAjc" 
JWT implementationJWT implementation
36
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
user:"luciano" 
pass:"mariobros"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
user:"luciano" 
pass:"mariobros"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
Create Token for "luciano"
Add signature
2. create
JWT
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
3. JWT Token
{"sub":"luciano"}
user:"luciano" 
pass:"mariobros"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
Create Token for "luciano"
Add signature
2. create
JWT
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
3. JWT Token
{"sub":"luciano"}
user:"luciano" 
pass:"mariobros"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
4. GET /profile
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
Create Token for "luciano"
Add signature
2. create
JWT
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
3. JWT Token
{"sub":"luciano"}
user:"luciano" 
pass:"mariobros"
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
4. GET /profile
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
Token says this is "luciano"
Signature looks OK
5. verify
Create Token for "luciano"
Add signature
2. create
JWT
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
3. JWT Token
{"sub":"luciano"}
user:"luciano" 
pass:"mariobros"
6. (page)
<h1>hello luciano</h1>
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
4. GET /profile
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
Token says this is "luciano"
Signature looks OK
5. verify
Create Token for "luciano"
Add signature
2. create
JWT
37
 
 
 
 
 
 
Browser
 
 
 
 
 
 
 
1. POST /login
3. JWT Token
{"sub":"luciano"}
user:"luciano" 
pass:"mariobros"
6. (page)
<h1>hello luciano</h1>
 
 
 
 
 
 
Server
 
 
 
 
 
 
 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
4. GET /profile
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJz
dWIiOiJsdWNpYW5vIn0.V92iQaqMrBUhkgEAyRaCY
7pezgH­Kls85DY8wHnFrk4
Token says this is "luciano"
Signature looks OK
5. verify
Create Token for "luciano"
Add signature
2. create
JWT
Note: Only the server
knows the secret
37
Cookie/sessionCookie/session
Needs a database to store the
session data
The database is queried for every
request to fetch the session
A session is identified only by a
randomly generated string
(session ID)
No data attached
Sessions can be invalidated at any
moment
JWTJWT
Doesn't need a session database
The session data is embedded in
the token
For every request the token
signature is verified
Attached metadata is readable
Sessions can't be invalidated, but
tokens might have an expiry flag
VSVS
38
Another great JWT use caseAnother great JWT use case
Creating Secure Password Reset LinksCreating Secure Password Reset Links
loige.link/jwt-pwd-reset
39
JWT LOOKS GREAT!JWT LOOKS GREAT!
But there are pitfalls...But there are pitfalls...
40
Data is public!Data is public!
41
Data is public!Data is public!
If you have a token,If you have a token,
you can easily read the claims!you can easily read the claims!
41
Data is public!Data is public!
If you have a token,If you have a token,
you can easily read the claims!you can easily read the claims!
You only have to Base64Url-decode the
token header and payload
and you have a readable JSON 41
There's no token database...There's no token database...
  
...if I can forge a token...if I can forge a token
nobody will know it's notnobody will know it's not
authentic!authentic!
42
DEMODEMO
JWT based web app
github.com/lmammino/sample-jwt-webapp
BUILT WITH
43
Given an HS256 signed JWTGiven an HS256 signed JWT
We can try to "We can try to "guessguess" the" the secretsecret!!
44
How difficult can it be?How difficult can it be?
45
Let's build a distributedLet's build a distributed
JWT token cracker!JWT token cracker!
 
npm.im/distributed-jwt-crackernpm.im/distributed-jwt-cracker
46
The idea...The idea...
47
The idea...The idea...
Take a valid JWT tokenTake a valid JWT token
47
The idea...The idea...
try to "guess" the secret and validate the token against ittry to "guess" the secret and validate the token against it
Take a valid JWT tokenTake a valid JWT token
47
The idea...The idea...
if the token is validated, then you found theif the token is validated, then you found the secretsecret!!
try to "guess" the secret and validate the token against ittry to "guess" the secret and validate the token against it
Take a valid JWT tokenTake a valid JWT token
47
The idea...The idea...
YOU CAN NOWYOU CAN NOW CREATE AND SIGNCREATE AND SIGN
ANY JWT TOKENANY JWT TOKEN FOR THISFOR THIS
APPLICATIONAPPLICATION!!
if the token is validated, then you found theif the token is validated, then you found the secretsecret!!
try to "guess" the secret and validate the token against ittry to "guess" the secret and validate the token against it
Take a valid JWT tokenTake a valid JWT token
47
Magic weaponsMagic weapons
48
Magic weaponsMagic weapons
Node.jsNode.js
48
Magic weaponsMagic weapons
Node.jsNode.js ZeroMQZeroMQ
48
Magic weaponsMagic weapons
Node.jsNode.js
modulemodule
jsonwebtokenjsonwebtoken
ZeroMQZeroMQ
48
ZeroMQZeroMQ
an open source embeddablean open source embeddable networkingnetworking
librarylibrary and aand a concurrency frameworkconcurrency framework
49
The brute force problemThe brute force problem
"virtually infinite" solutions space"virtually infinite" solutions space
all the strings (of any length) that can be generated within a given alphabet
(empty string), a, b, c, 1, aa, ab, ac, a1, ba, bb, bc, b1, ca, cb, cc, c1, 1a, 1b, 1c, 11, aaa,
aab, aac, aa1, aba, ...
50
bijection (int) ⇒(string)bijection (int) ⇒(string)
if we sort all the possible strings over an alphabet
 
Alphabet = [a,b]
0 ⟶ (empty string) 
1 ⟶ a 
2 ⟶ b 
3 ⟶ aa 
4 ⟶ ab 
5 ⟶ ba 
6 ⟶ bb
7 ⟶ aaa
8 ⟶ aab
9 ⟶ aba
10 ⟶ abb 
11 ⟶ baa 
12 ⟶ bab 
13 ⟶ bba 
14 ⟶ bbb 
15 ⟶ aaaa 
16 ⟶ aaab
17 ⟶ aaba
18 ⟶ aabb
...
51
ArchitectureArchitecture
ServerServer ClientClient
Initialised with a valid JWT token
and an alphabet
coordinates the brute force
attempts among connected clients
knows how to verify a token against
a given secret
receives ranges of secrets to check
52
Networking patternsNetworking patterns
Router channels:
dispatch jobs
receive results
 
Pub/Sub channel:
termination
signal
53
Server stateServer state
the solution space can be sliced intothe solution space can be sliced into
chunkschunks of fixed length (batch size)of fixed length (batch size)
54
Server stateServer state
the solution space can be sliced intothe solution space can be sliced into
chunkschunks of fixed length (batch size)of fixed length (batch size)
0 3 6 9 ...
54
Server stateServer state
the solution space can be sliced intothe solution space can be sliced into
chunkschunks of fixed length (batch size)of fixed length (batch size)
0
batch 1
3 6 9 ...
54
Server stateServer state
the solution space can be sliced intothe solution space can be sliced into
chunkschunks of fixed length (batch size)of fixed length (batch size)
0
batch 1 batch 2
3 6 9 ...
54
Server stateServer state
the solution space can be sliced intothe solution space can be sliced into
chunkschunks of fixed length (batch size)of fixed length (batch size)
0
batch 1 batch 2 batch 3
3 6 9 ...
54
Server stateServer state
the solution space can be sliced intothe solution space can be sliced into
chunkschunks of fixed length (batch size)of fixed length (batch size)
0
...batch 1 batch 2 batch 3
3 6 9 ...
54
Initial server stateInitial server state
{ 
  "cursor": 0, 
  "clients": {} 
}
55
The first client connectsThe first client connects
{ 
  "cursor": 3, 
  "clients": { 
    "client1": [0,2] 
  } 
}
[0,2]
56
{ 
  "cursor": 9, 
  "clients": { 
    "client1": [0,2],     
    "client2": [3,5],
    "client3": [6,8] 
  } 
}
Other clients connectOther clients connect
[0,2]
[3,5] [6,8]
57
Client 2 finishes its jobClient 2 finishes its job
{ 
  "cursor": 12, 
  "clients": { 
    "client1": [0,2],     
    "client2": [9,11],
    "client3": [6,8] 
  } 
}
[0,2]
[9,11] [6,8]
58
let cursor = 0
const clients = new Map()
const assignNextBatch = client => {
const from = cursor
const to = cursor + batchSize - 1
const batch = [from, to]
cursor = cursor + batchSize
client.currentBatch = batch
client.currentBatchStartedAt = new Date()
return batch
}
const addClient = channel => {
const id = channel.toString('hex')
const client = {id, channel, joinedAt: new Date()}
assignNextBatch(client)
clients.set(id, client)
return client
}
Server
59
Messages flowMessages flow
60
Messages flowMessages flow
 
 
 
JWT Cracker
Server
 
 
 
 
 
 
 
JWT Cracker
Client
 
 
 
 
60
Messages flowMessages flow
 
 
 
JWT Cracker
Server
 
 
 
 
 
 
 
JWT Cracker
Client
 
 
 
 
1. JOIN
60
Messages flowMessages flow
 
 
 
JWT Cracker
Server
 
 
 
 
 
 
 
JWT Cracker
Client
 
 
 
 
1. JOIN
2. START
{token, alphabet, firstBatch}
60
Messages flowMessages flow
 
 
 
JWT Cracker
Server
 
 
 
 
 
 
 
JWT Cracker
Client
 
 
 
 
1. JOIN
2. START
{token, alphabet, firstBatch}
3. NEXT
60
Messages flowMessages flow
 
 
 
JWT Cracker
Server
 
 
 
 
 
 
 
JWT Cracker
Client
 
 
 
 
1. JOIN
2. START
{token, alphabet, firstBatch}
3. NEXT
4. BATCH
{nextBatch}
60
Messages flowMessages flow
 
 
 
JWT Cracker
Server
 
 
 
 
 
 
 
JWT Cracker
Client
 
 
 
 
1. JOIN
2. START
{token, alphabet, firstBatch}
3. NEXT
4. BATCH
{nextBatch}
5. SUCCESS
{secret}
60
const router = (channel, rawMessage) => {
const msg = JSON.parse(rawMessage.toString())
switch (msg.type) {
case 'join': {
const client = addClient(channel)
const response = {
type: 'start',
id: client.id,
batch: client.currentBatch,
alphabet,
token
}
batchSocket.send([channel, JSON.stringify(response)])
break
}
case 'next': {
const batch = assignNextBatch(clients.get(channel.toString('hex')))
batchSocket.send([channel, JSON.stringify({type: 'batch', batch})])
break
}
case 'success': {
const secret = msg.secret
// publish exit signal and closes the app
signalSocket.send(['exit', JSON.stringify({secret, client: channel.toString('hex')})], 0, () => {
batchSocket.close()
signalSocket.close()
exit(0)
})
break
}
}
}
Server
61
let id, variations, token
const dealer = rawMessage => {
const msg = JSON.parse(rawMessage.toString())
const start = msg => {
id = msg.id
variations = generator(msg.alphabet)
token = msg.token
}
const batch = msg => {
processBatch(token, variations, msg.batch, (secret, index) => {
if (typeof secret === 'undefined') {
// request next batch
batchSocket.send(JSON.stringify({type: 'next'}))
} else {
// propagate success
batchSocket.send(JSON.stringify({type: 'success', secret, index}))
exit(0)
}
})
}
switch (msg.type) {
case 'start':
start(msg)
batch(msg)
break
case 'batch':
batch(msg)
break
}
}
Client
62
How a chunk is processedHow a chunk is processed
Given chunk [3,6] over alphabet "ab"
[3,6] ⇒
3 ⟶ aa 
4 ⟶ ab 
5 ⟶ ba 
6 ⟶ bb
⇠check if one of the
strings is the secret
that validates the
current token
63
const jwt = require('jsonwebtoken')
const generator = require('indexed-string-variation').generator;
const variations = generator('someAlphabet')
const processChunk = (token, from, to) => {
let secret
for (let i = from; i < to; i++) {
try {
secret = variations(i)
jwt.verify(token, pwd, {
ignoreExpiration: true,
ignoreNotBefore: true
})
// finished, password found
return ({found: secret})
} catch (err) {} // password not found, keep looping
}
// finished, password not found
return null
}
Client
64
DemoDemo
65
Closing offClosing off
66
Is JWT safe to use?Is JWT safe to use?
67
DefinitelyDefinitely
YES!YES!
Heavily used by:
68
but...but...
69
Use a strong (≃long)Use a strong (≃long) secretsecret and keep it SAFE! and keep it SAFE!
Or, even better
Use RS256 (RSA public/private key pair) signatureUse RS256 (RSA public/private key pair) signature
Use it wisely!Use it wisely!
70
But, what if I createBut, what if I create
onlyonly
short lived tokensshort lived tokens......
71
JWT is STATELESS!JWT is STATELESS!
the expiry time is contained in the token...
if you can edit tokens, you can extend the expiry time as needed!
72
Should I be worried aboutShould I be worried about
brute forcebrute force??
73
Not reallyNot really
... As long as you know the basic rules... As long as you know the basic rules
(and the priorities) to defend yourself(and the priorities) to defend yourself
74
TLDR;TLDR;
JWT is aJWT is a cool & stateless™cool & stateless™ way toway to
transfer claims!transfer claims!
 
Choose the right Algorithm
With HS256, choose a good secret and keep it safe
Don't disclose sensitive information in the payload
Don't be too worried about brute force, but understand how it works!
75
Takk!
@loige@loige
https://loige.cohttps://loige.co
loige.link/jwt-crack-oslo
76
CreditsCredits
vector imagesvector images
designed by freepikdesigned by freepik
an      heartfelt thank you to:
@AlleviTommaso
@andreaman87
@cirpo
@katavic_d
@Podgeypoos79
@quasi_modal 77

Contenu connexe

Tendances

02 banking trojans-thomassiebert
02 banking trojans-thomassiebert02 banking trojans-thomassiebert
02 banking trojans-thomassiebertgeeksec80
 
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET CoreNETFest
 
Testing For Unicorns
Testing For UnicornsTesting For Unicorns
Testing For UnicornsAlex Soto
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by pythonwonyong hwang
 
Switcheo Network - Advanced NEO Smart Contracts
Switcheo Network - Advanced NEO Smart ContractsSwitcheo Network - Advanced NEO Smart Contracts
Switcheo Network - Advanced NEO Smart ContractsSwitcheo
 
Concept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized ApplicationConcept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized ApplicationSeiji Takahashi
 
We need t go deeper - Testing inception apps.
We need t go deeper - Testing inception apps.We need t go deeper - Testing inception apps.
We need t go deeper - Testing inception apps.SecuRing
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedMaxim Kulsha
 
Obfuscation-Resilient Privacy Leak Detection for Mobile Apps
Obfuscation-Resilient Privacy Leak Detection for Mobile Apps Obfuscation-Resilient Privacy Leak Detection for Mobile Apps
Obfuscation-Resilient Privacy Leak Detection for Mobile Apps NECST Lab @ Politecnico di Milano
 
The Ring programming language version 1.5.3 book - Part 93 of 184
The Ring programming language version 1.5.3 book - Part 93 of 184The Ring programming language version 1.5.3 book - Part 93 of 184
The Ring programming language version 1.5.3 book - Part 93 of 184Mahmoud Samir Fayed
 
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...Xlator
 
[CB16] Esoteric Web Application Vulnerabilities by Andrés Riancho
[CB16] Esoteric Web Application Vulnerabilities by Andrés Riancho[CB16] Esoteric Web Application Vulnerabilities by Andrés Riancho
[CB16] Esoteric Web Application Vulnerabilities by Andrés RianchoCODE BLUE
 
Binaries Are Not Only Output
Binaries Are Not Only OutputBinaries Are Not Only Output
Binaries Are Not Only OutputHajime Morrita
 
20101017 program analysis_for_security_livshits_lecture04_nozzle
20101017 program analysis_for_security_livshits_lecture04_nozzle20101017 program analysis_for_security_livshits_lecture04_nozzle
20101017 program analysis_for_security_livshits_lecture04_nozzleComputer Science Club
 
Laporan multiclient chatting client server
Laporan multiclient chatting client serverLaporan multiclient chatting client server
Laporan multiclient chatting client servertrilestari08
 
Cargo Cult Security UJUG Sep2015
Cargo Cult Security UJUG Sep2015Cargo Cult Security UJUG Sep2015
Cargo Cult Security UJUG Sep2015Derrick Isaacson
 
Testing for Unicorns
Testing for UnicornsTesting for Unicorns
Testing for UnicornsAlex Soto
 

Tendances (20)

02 banking trojans-thomassiebert
02 banking trojans-thomassiebert02 banking trojans-thomassiebert
02 banking trojans-thomassiebert
 
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core
 
Testing For Unicorns
Testing For UnicornsTesting For Unicorns
Testing For Unicorns
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
 
Building Advanced XSS Vectors
Building Advanced XSS VectorsBuilding Advanced XSS Vectors
Building Advanced XSS Vectors
 
Switcheo Network - Advanced NEO Smart Contracts
Switcheo Network - Advanced NEO Smart ContractsSwitcheo Network - Advanced NEO Smart Contracts
Switcheo Network - Advanced NEO Smart Contracts
 
Concept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized ApplicationConcept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized Application
 
We need t go deeper - Testing inception apps.
We need t go deeper - Testing inception apps.We need t go deeper - Testing inception apps.
We need t go deeper - Testing inception apps.
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
Obfuscation-Resilient Privacy Leak Detection for Mobile Apps
Obfuscation-Resilient Privacy Leak Detection for Mobile Apps Obfuscation-Resilient Privacy Leak Detection for Mobile Apps
Obfuscation-Resilient Privacy Leak Detection for Mobile Apps
 
The Ring programming language version 1.5.3 book - Part 93 of 184
The Ring programming language version 1.5.3 book - Part 93 of 184The Ring programming language version 1.5.3 book - Part 93 of 184
The Ring programming language version 1.5.3 book - Part 93 of 184
 
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...
 
Stop Monkeys Fall
Stop Monkeys FallStop Monkeys Fall
Stop Monkeys Fall
 
[CB16] Esoteric Web Application Vulnerabilities by Andrés Riancho
[CB16] Esoteric Web Application Vulnerabilities by Andrés Riancho[CB16] Esoteric Web Application Vulnerabilities by Andrés Riancho
[CB16] Esoteric Web Application Vulnerabilities by Andrés Riancho
 
Binaries Are Not Only Output
Binaries Are Not Only OutputBinaries Are Not Only Output
Binaries Are Not Only Output
 
20101017 program analysis_for_security_livshits_lecture04_nozzle
20101017 program analysis_for_security_livshits_lecture04_nozzle20101017 program analysis_for_security_livshits_lecture04_nozzle
20101017 program analysis_for_security_livshits_lecture04_nozzle
 
Laporan multiclient chatting client server
Laporan multiclient chatting client serverLaporan multiclient chatting client server
Laporan multiclient chatting client server
 
Cargo Cult Security UJUG Sep2015
Cargo Cult Security UJUG Sep2015Cargo Cult Security UJUG Sep2015
Cargo Cult Security UJUG Sep2015
 
Hack ASP.NET website
Hack ASP.NET websiteHack ASP.NET website
Hack ASP.NET website
 
Testing for Unicorns
Testing for UnicornsTesting for Unicorns
Testing for Unicorns
 

Similaire à Cracking JWT tokens: a tale of magic, Node.js and parallel computing - WebRebels Oslo, 5 June 2018

Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...
Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...
Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...Luciano Mammino
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Luciano Mammino
 
In-Toto OpenChain Presentation 03-18-2019
In-Toto OpenChain Presentation 03-18-2019In-Toto OpenChain Presentation 03-18-2019
In-Toto OpenChain Presentation 03-18-2019Shane Coughlan
 
2016 pycontw web api authentication
2016 pycontw web api authentication 2016 pycontw web api authentication
2016 pycontw web api authentication Micron Technology
 
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...Codemotion
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computingCracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computingLuciano Mammino
 
Javascript Object Signing & Encryption
Javascript Object Signing & EncryptionJavascript Object Signing & Encryption
Javascript Object Signing & EncryptionAaron Zauner
 
xAPI Camp-Four Lines of Code
xAPI Camp-Four Lines of CodexAPI Camp-Four Lines of Code
xAPI Camp-Four Lines of CodeAnthony Altieri
 
Architecting Secure and Compliant Applications with MongoDB
Architecting Secure and Compliant Applications with MongoDB        Architecting Secure and Compliant Applications with MongoDB
Architecting Secure and Compliant Applications with MongoDB MongoDB
 
Sandboxie process isolation with kernel hooks
Sandboxie process isolation with kernel hooksSandboxie process isolation with kernel hooks
Sandboxie process isolation with kernel hooksKarlFrank99
 
Do more with less code in a serverless world
Do more with less code in a serverless worldDo more with less code in a serverless world
Do more with less code in a serverless worldjeromevdl
 
Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)
Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)
Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)Andrés Viedma Peláez
 
Webinar: Architecting Secure and Compliant Applications with MongoDB
Webinar: Architecting Secure and Compliant Applications with MongoDBWebinar: Architecting Secure and Compliant Applications with MongoDB
Webinar: Architecting Secure and Compliant Applications with MongoDBMongoDB
 
Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Ivan Rosolen
 
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"South Tyrol Free Software Conference
 
The Mouse is mightier than the sword
The Mouse is mightier than the swordThe Mouse is mightier than the sword
The Mouse is mightier than the swordPriyanka Aash
 
If you give a mouse a clickhouse, by Alex Hofsteede, Sentry
If you give a mouse a clickhouse, by Alex Hofsteede, SentryIf you give a mouse a clickhouse, by Alex Hofsteede, Sentry
If you give a mouse a clickhouse, by Alex Hofsteede, SentryAltinity Ltd
 
Rapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and KtorRapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and KtorTrayan Iliev
 

Similaire à Cracking JWT tokens: a tale of magic, Node.js and parallel computing - WebRebels Oslo, 5 June 2018 (20)

Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...
Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...
Cracking JWT tokens: a tale of magic, Node.js and parallel computing - Code E...
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
 
In-Toto OpenChain Presentation 03-18-2019
In-Toto OpenChain Presentation 03-18-2019In-Toto OpenChain Presentation 03-18-2019
In-Toto OpenChain Presentation 03-18-2019
 
2016 pycontw web api authentication
2016 pycontw web api authentication 2016 pycontw web api authentication
2016 pycontw web api authentication
 
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computingCracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
 
Javascript Object Signing & Encryption
Javascript Object Signing & EncryptionJavascript Object Signing & Encryption
Javascript Object Signing & Encryption
 
xAPI Camp-Four Lines of Code
xAPI Camp-Four Lines of CodexAPI Camp-Four Lines of Code
xAPI Camp-Four Lines of Code
 
Architecting Secure and Compliant Applications with MongoDB
Architecting Secure and Compliant Applications with MongoDB        Architecting Secure and Compliant Applications with MongoDB
Architecting Secure and Compliant Applications with MongoDB
 
Sandboxie process isolation with kernel hooks
Sandboxie process isolation with kernel hooksSandboxie process isolation with kernel hooks
Sandboxie process isolation with kernel hooks
 
Do more with less code in a serverless world
Do more with less code in a serverless worldDo more with less code in a serverless world
Do more with less code in a serverless world
 
Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)
Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)
Poniendo Kotlin en producción a palos (Kotlin in production, the hard way)
 
JSON Web Tokens
JSON Web TokensJSON Web Tokens
JSON Web Tokens
 
Webinar: Architecting Secure and Compliant Applications with MongoDB
Webinar: Architecting Secure and Compliant Applications with MongoDBWebinar: Architecting Secure and Compliant Applications with MongoDB
Webinar: Architecting Secure and Compliant Applications with MongoDB
 
Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)
 
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
 
Token based-oauth2
Token based-oauth2Token based-oauth2
Token based-oauth2
 
The Mouse is mightier than the sword
The Mouse is mightier than the swordThe Mouse is mightier than the sword
The Mouse is mightier than the sword
 
If you give a mouse a clickhouse, by Alex Hofsteede, Sentry
If you give a mouse a clickhouse, by Alex Hofsteede, SentryIf you give a mouse a clickhouse, by Alex Hofsteede, Sentry
If you give a mouse a clickhouse, by Alex Hofsteede, Sentry
 
Rapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and KtorRapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and Ktor
 

Plus de Luciano Mammino

Did you know JavaScript has iterators? DublinJS
Did you know JavaScript has iterators? DublinJSDid you know JavaScript has iterators? DublinJS
Did you know JavaScript has iterators? DublinJSLuciano Mammino
 
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...Luciano Mammino
 
Building an invite-only microsite with Next.js & Airtable - ReactJS Milano
Building an invite-only microsite with Next.js & Airtable - ReactJS MilanoBuilding an invite-only microsite with Next.js & Airtable - ReactJS Milano
Building an invite-only microsite with Next.js & Airtable - ReactJS MilanoLuciano Mammino
 
From Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiperFrom Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiperLuciano Mammino
 
Let's build a 0-cost invite-only website with Next.js and Airtable!
Let's build a 0-cost invite-only website with Next.js and Airtable!Let's build a 0-cost invite-only website with Next.js and Airtable!
Let's build a 0-cost invite-only website with Next.js and Airtable!Luciano Mammino
 
Everything I know about S3 pre-signed URLs
Everything I know about S3 pre-signed URLsEverything I know about S3 pre-signed URLs
Everything I know about S3 pre-signed URLsLuciano Mammino
 
Serverless for High Performance Computing
Serverless for High Performance ComputingServerless for High Performance Computing
Serverless for High Performance ComputingLuciano Mammino
 
Serverless for High Performance Computing
Serverless for High Performance ComputingServerless for High Performance Computing
Serverless for High Performance ComputingLuciano Mammino
 
JavaScript Iteration Protocols - Workshop NodeConf EU 2022
JavaScript Iteration Protocols - Workshop NodeConf EU 2022JavaScript Iteration Protocols - Workshop NodeConf EU 2022
JavaScript Iteration Protocols - Workshop NodeConf EU 2022Luciano Mammino
 
Building an invite-only microsite with Next.js & Airtable
Building an invite-only microsite with Next.js & AirtableBuilding an invite-only microsite with Next.js & Airtable
Building an invite-only microsite with Next.js & AirtableLuciano Mammino
 
Let's take the monolith to the cloud 🚀
Let's take the monolith to the cloud 🚀Let's take the monolith to the cloud 🚀
Let's take the monolith to the cloud 🚀Luciano Mammino
 
A look inside the European Covid Green Certificate - Rust Dublin
A look inside the European Covid Green Certificate - Rust DublinA look inside the European Covid Green Certificate - Rust Dublin
A look inside the European Covid Green Certificate - Rust DublinLuciano Mammino
 
Node.js: scalability tips - Azure Dev Community Vijayawada
Node.js: scalability tips - Azure Dev Community VijayawadaNode.js: scalability tips - Azure Dev Community Vijayawada
Node.js: scalability tips - Azure Dev Community VijayawadaLuciano Mammino
 
A look inside the European Covid Green Certificate (Codemotion 2021)
A look inside the European Covid Green Certificate (Codemotion 2021)A look inside the European Covid Green Certificate (Codemotion 2021)
A look inside the European Covid Green Certificate (Codemotion 2021)Luciano Mammino
 
AWS Observability Made Simple
AWS Observability Made SimpleAWS Observability Made Simple
AWS Observability Made SimpleLuciano Mammino
 
Semplificare l'observability per progetti Serverless
Semplificare l'observability per progetti ServerlessSemplificare l'observability per progetti Serverless
Semplificare l'observability per progetti ServerlessLuciano Mammino
 
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021Luciano Mammino
 
Finding a lost song with Node.js and async iterators - EnterJS 2021
Finding a lost song with Node.js and async iterators - EnterJS 2021Finding a lost song with Node.js and async iterators - EnterJS 2021
Finding a lost song with Node.js and async iterators - EnterJS 2021Luciano Mammino
 

Plus de Luciano Mammino (20)

Did you know JavaScript has iterators? DublinJS
Did you know JavaScript has iterators? DublinJSDid you know JavaScript has iterators? DublinJS
Did you know JavaScript has iterators? DublinJS
 
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...
What I learned by solving 50 Advent of Code challenges in Rust - RustNation U...
 
Building an invite-only microsite with Next.js & Airtable - ReactJS Milano
Building an invite-only microsite with Next.js & Airtable - ReactJS MilanoBuilding an invite-only microsite with Next.js & Airtable - ReactJS Milano
Building an invite-only microsite with Next.js & Airtable - ReactJS Milano
 
From Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiperFrom Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiper
 
Let's build a 0-cost invite-only website with Next.js and Airtable!
Let's build a 0-cost invite-only website with Next.js and Airtable!Let's build a 0-cost invite-only website with Next.js and Airtable!
Let's build a 0-cost invite-only website with Next.js and Airtable!
 
Everything I know about S3 pre-signed URLs
Everything I know about S3 pre-signed URLsEverything I know about S3 pre-signed URLs
Everything I know about S3 pre-signed URLs
 
Serverless for High Performance Computing
Serverless for High Performance ComputingServerless for High Performance Computing
Serverless for High Performance Computing
 
Serverless for High Performance Computing
Serverless for High Performance ComputingServerless for High Performance Computing
Serverless for High Performance Computing
 
JavaScript Iteration Protocols - Workshop NodeConf EU 2022
JavaScript Iteration Protocols - Workshop NodeConf EU 2022JavaScript Iteration Protocols - Workshop NodeConf EU 2022
JavaScript Iteration Protocols - Workshop NodeConf EU 2022
 
Building an invite-only microsite with Next.js & Airtable
Building an invite-only microsite with Next.js & AirtableBuilding an invite-only microsite with Next.js & Airtable
Building an invite-only microsite with Next.js & Airtable
 
Let's take the monolith to the cloud 🚀
Let's take the monolith to the cloud 🚀Let's take the monolith to the cloud 🚀
Let's take the monolith to the cloud 🚀
 
A look inside the European Covid Green Certificate - Rust Dublin
A look inside the European Covid Green Certificate - Rust DublinA look inside the European Covid Green Certificate - Rust Dublin
A look inside the European Covid Green Certificate - Rust Dublin
 
Monoliths to the cloud!
Monoliths to the cloud!Monoliths to the cloud!
Monoliths to the cloud!
 
The senior dev
The senior devThe senior dev
The senior dev
 
Node.js: scalability tips - Azure Dev Community Vijayawada
Node.js: scalability tips - Azure Dev Community VijayawadaNode.js: scalability tips - Azure Dev Community Vijayawada
Node.js: scalability tips - Azure Dev Community Vijayawada
 
A look inside the European Covid Green Certificate (Codemotion 2021)
A look inside the European Covid Green Certificate (Codemotion 2021)A look inside the European Covid Green Certificate (Codemotion 2021)
A look inside the European Covid Green Certificate (Codemotion 2021)
 
AWS Observability Made Simple
AWS Observability Made SimpleAWS Observability Made Simple
AWS Observability Made Simple
 
Semplificare l'observability per progetti Serverless
Semplificare l'observability per progetti ServerlessSemplificare l'observability per progetti Serverless
Semplificare l'observability per progetti Serverless
 
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
 
Finding a lost song with Node.js and async iterators - EnterJS 2021
Finding a lost song with Node.js and async iterators - EnterJS 2021Finding a lost song with Node.js and async iterators - EnterJS 2021
Finding a lost song with Node.js and async iterators - EnterJS 2021
 

Dernier

Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlPeter Udo Diehl
 
Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessUXDXConf
 
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxUnpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxDavid Michel
 
Where to Learn More About FDO _ Richard at FIDO Alliance.pdf
Where to Learn More About FDO _ Richard at FIDO Alliance.pdfWhere to Learn More About FDO _ Richard at FIDO Alliance.pdf
Where to Learn More About FDO _ Richard at FIDO Alliance.pdfFIDO Alliance
 
IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIES VE
 
What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024Stephanie Beckett
 
Oauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoftOauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoftshyamraj55
 
THE BEST IPTV in GERMANY for 2024: IPTVreel
THE BEST IPTV in  GERMANY for 2024: IPTVreelTHE BEST IPTV in  GERMANY for 2024: IPTVreel
THE BEST IPTV in GERMANY for 2024: IPTVreelreely ones
 
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...FIDO Alliance
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutesconfluent
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityScyllaDB
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomCzechDreamin
 
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...marcuskenyatta275
 
Strategic AI Integration in Engineering Teams
Strategic AI Integration in Engineering TeamsStrategic AI Integration in Engineering Teams
Strategic AI Integration in Engineering TeamsUXDXConf
 
ECS 2024 Teams Premium - Pretty Secure
ECS 2024   Teams Premium - Pretty SecureECS 2024   Teams Premium - Pretty Secure
ECS 2024 Teams Premium - Pretty SecureFemke de Vroome
 
The UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, OcadoThe UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, OcadoUXDXConf
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...CzechDreamin
 
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptxWSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptxJennifer Lim
 
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...FIDO Alliance
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...CzechDreamin
 

Dernier (20)

Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
 
Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for Success
 
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxUnpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
 
Where to Learn More About FDO _ Richard at FIDO Alliance.pdf
Where to Learn More About FDO _ Richard at FIDO Alliance.pdfWhere to Learn More About FDO _ Richard at FIDO Alliance.pdf
Where to Learn More About FDO _ Richard at FIDO Alliance.pdf
 
IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and Planning
 
What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024
 
Oauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoftOauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoft
 
THE BEST IPTV in GERMANY for 2024: IPTVreel
THE BEST IPTV in  GERMANY for 2024: IPTVreelTHE BEST IPTV in  GERMANY for 2024: IPTVreel
THE BEST IPTV in GERMANY for 2024: IPTVreel
 
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutes
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through Observability
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
 
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
 
Strategic AI Integration in Engineering Teams
Strategic AI Integration in Engineering TeamsStrategic AI Integration in Engineering Teams
Strategic AI Integration in Engineering Teams
 
ECS 2024 Teams Premium - Pretty Secure
ECS 2024   Teams Premium - Pretty SecureECS 2024   Teams Premium - Pretty Secure
ECS 2024 Teams Premium - Pretty Secure
 
The UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, OcadoThe UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, Ocado
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
 
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptxWSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
 
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
 

Cracking JWT tokens: a tale of magic, Node.js and parallel computing - WebRebels Oslo, 5 June 2018