@@ -364,20 +364,38 @@ def get_validation_results(self) -> List[ValidationResult]:
364364 """
365365 return self .validation_results .copy ()
366366
367+ def clear_credentials (self ):
368+ """Overwrite all stored credential data in memory to prevent leakage."""
369+ # Overwrite passwords in validation results
370+ for result in self .validation_results :
371+ if result .submission .password :
372+ result .submission .password = '\x00 ' * len (result .submission .password )
373+ result .submission .password = ''
374+ # Overwrite passwords in pending submissions
375+ for submission in self .pending_submissions .values ():
376+ if submission .password :
377+ submission .password = '\x00 ' * len (submission .password )
378+ submission .password = ''
379+ # Overwrite valid credential tuples
380+ for i , (ssid , password ) in enumerate (self .valid_credentials ):
381+ self .valid_credentials [i ] = (ssid , '\x00 ' * len (password ))
382+ self .valid_credentials .clear ()
383+ log_info ('CredentialHandler' , 'Credential data cleared from memory' )
384+
367385 def clear_statistics (self ):
368386 """Clear all statistics and results."""
387+ self .clear_credentials ()
369388 self .validation_results .clear ()
370- self .valid_credentials .clear ()
371389 self .client_attempts .clear ()
372390 self .client_last_attempt .clear ()
373-
391+
374392 self .total_submissions = 0
375393 self .total_validations = 0
376394 self .successful_validations = 0
377395 self .failed_validations = 0
378-
396+
379397 log_info ('CredentialHandler' , 'Statistics cleared' )
380-
398+
381399 def __str__ (self ):
382400 stats = self .get_statistics ()
383401 return (f'CredentialHandler: { stats ["total_submissions" ]} submissions, '
0 commit comments