mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
my thoughts to jwt
This commit is contained in:
parent
540bcaeb89
commit
defb93ba7f
28
docu/Concepts/Snippets/Authorization/concept.md
Normal file
28
docu/Concepts/Snippets/Authorization/concept.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# Authorization and Private Keys
|
||||||
|
## Keys
|
||||||
|
For creating transactions ed25519 keys are used for signing.
|
||||||
|
As long the user is the only controlling the private key he is the only one
|
||||||
|
how can sign transactions on his behalf.
|
||||||
|
It is a core concept of all crypto currencies and important for the concept,
|
||||||
|
that the user has full control over his data.
|
||||||
|
|
||||||
|
Usually crypto currencies like bitcoin or iota save the keys on local system,
|
||||||
|
maybe additional protected with a password which is used to encrypt the keys.
|
||||||
|
|
||||||
|
## Gradido
|
||||||
|
Gradido should be easy to use, so we must offer a solution for everyone not that fit
|
||||||
|
with computer, as easy to use like paypal.
|
||||||
|
For that role we have the Login-Server.
|
||||||
|
It stores the private keys of the user encrypted with there email and password.
|
||||||
|
Additional it stores the passphrase which can be used to generate the private key,
|
||||||
|
encryted with server admin public key. So only the server admin can access the keys
|
||||||
|
with his private key. [not done yet]
|
||||||
|
It is needed for passwort reset if a user has forgetten his password.
|
||||||
|
|
||||||
|
But for the entire concept Login-Server isn't the only way to store the private keys.
|
||||||
|
For users which has more experience with computer and especially with crypto currencies
|
||||||
|
it should be a way to keep there private keys by themselfs.
|
||||||
|
|
||||||
|
For example a Desktop- or Handy-App which store the keys locally maybe additional encrypted.
|
||||||
|
Maybe it is possible to use Stronghold from iota for that.
|
||||||
|
With that the user don't need to use the Login-Server.
|
||||||
20
docu/Concepts/Snippets/Authorization/jwt.md
Normal file
20
docu/Concepts/Snippets/Authorization/jwt.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# How JWT could be used for authorization with and without Login-Server
|
||||||
|
## What we need
|
||||||
|
The only encrypted data in db are the private key.
|
||||||
|
Every other data could be accessed without login, depending on frontend and backend code.
|
||||||
|
So we need only a way to prove the backend that we have access to the private key.
|
||||||
|
|
||||||
|
## JWT
|
||||||
|
JWT is perfect for that.
|
||||||
|
We can use JWT to store the public key of the user as UUID for finding his data in db,
|
||||||
|
signing it with the private key. So even if the backend is running in multiple instances,
|
||||||
|
on every request is it possible to check the JWT token, that the signature is signed with
|
||||||
|
the private key, belonging to the public key.
|
||||||
|
The only thing the backend cannot do with that is signing a transaction.
|
||||||
|
That can only be done by the Login-Server or a Desktop or Handy-App storing the private key locally.
|
||||||
|
With that we have universal way for authorization against the backend.
|
||||||
|
We could additional store if we like to sign transactions local or with Login-Server and the Login-Server url.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
16
docu/Concepts/Snippets/Authorization/session_id.md
Normal file
16
docu/Concepts/Snippets/Authorization/session_id.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Session Id Authorization
|
||||||
|
## Login-Server
|
||||||
|
With every login, the Login-Server creates a session with a random id,
|
||||||
|
storing it in memory. For Login email and password are needed.
|
||||||
|
From email and an additional app-secret (**crypto.app_secret** in Login-Server config) a sha512 hash will be genereted, named **hash512_salt**.
|
||||||
|
With sodium function *crypto_pwhash* with **hash512_salt** and user password a secret encryption key will be calculated.
|
||||||
|
*crypto_pwhash* uses argon2 algorithmus to have a CPU hard calculation. Currently it is configured for < 0.5s.
|
||||||
|
So it is harder to use brute-force attacks to guess the password. Even if someone gets hands on the data saved in db.
|
||||||
|
|
||||||
|
With sodium function *crypto_shorthash* a hash will be calculated from the secret encryption key and server crypto key (**crypto.server_key** in Login-Server config, hex encoded, 16 Bytes, 32 Character hex encoded)
|
||||||
|
and compared against saved hash in db. If they identical user has successfull logged in.
|
||||||
|
The secret encryption key will be stored in memory together with the user session and client ip from which login call came.
|
||||||
|
The session_id will be returned.
|
||||||
|
The session will be hold in memory for 15 minutes default, can be changed in Login-Server config field **session.timeout**
|
||||||
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user