@@ -65,11 +65,13 @@ def APP_STATUS(): return "init" if db.get("password") is None else "run"
6565def JWT_SECRET (): return db .get ("secret" )
6666
6767def hash_psw (psw : str ):
68- salt = db .get ("salt" )
69- if not salt :
70- salt = secrets .token_hex (32 )
71- db .put ("salt" , salt )
72- return hashlib .pbkdf2_hmac ("sha256" , psw .encode (), salt .encode (), 500_000 ).hex ()
68+ salt = secrets .token_hex (32 )
69+ return hashlib .pbkdf2_hmac ("sha256" , psw .encode (), salt .encode (), 500_000 ).hex ()+ "-" + salt
70+
71+ def verify_psw (psw : str , hashed : str ) -> bool :
72+ psw_hash , salt = hashed .split ("-" )
73+ new_hashed = hashlib .pbkdf2_hmac ("sha256" , psw .encode (), salt .encode (), 500_000 ).hex ()
74+ return new_hashed == psw_hash
7375
7476def set_psw (psw : str ):
7577 db .put ("password" , hash_psw (psw ))
@@ -142,7 +144,7 @@ async def login_api(form: OAuth2PasswordRequestForm = Depends()):
142144 if form .password == "" :
143145 return {"status" :"Cannot insert an empty password!" }
144146 await asyncio .sleep (0.3 ) # No bruteforce :)
145- if db .get ("password" ) == hash_psw ( form . password ):
147+ if verify_psw ( form . password , db .get ("password" )):
146148 return {"access_token" : create_access_token ({"logged_in" : True }), "token_type" : "bearer" }
147149 raise HTTPException (406 ,"Wrong password!" )
148150
@@ -185,8 +187,8 @@ async def get_ip_interfaces():
185187
186188async def startup_main ():
187189 db .init ()
188- if os .getenv ("HEX_SET_PSW " ):
189- set_psw ( bytes . fromhex ( os .getenv ("HEX_SET_PSW" )). decode ( ))
190+ if os .getenv ("PSW_HASH_SET " ):
191+ db . put ( "password" , os .getenv ("PSW_HASH_SET" ))
190192 try :
191193 sysctl .set ()
192194 except Exception as e :
0 commit comments