2

I am implementing a class that represents a connection to e.g., an API/database, and want to provide a method to reconnect when the connection is lost (e.g., due to a timeout). The user provides a username and a password at initialization, which has to be in raw text due to API requirements.

I think one should NOT store the password in any instance variable; I am aware that one may use the “keyring” library, but was wondering if there is any way that does not depend on external libraries and/or the password cannot be later revealed by any means.

One method I came up with is to use a lambda creator:

class Connection:
    def __init__(self, *args, **kwargs):
         # other stuff
         password = input(“some message”)
         self.connection_handle = (lambda pass : (lambda : api.connect(password=pass))(password)
         del password
         self.conn = self.connection_handle()

    def reconnect(self):
         self.conn = self.connection_handle()

where for simplicity we assume only password, which is a raw password, is used by some API provided connection procedure api.connect.

I tried inspect.showsource and also examined other attributes of connection_handle. It seemed to me that one cannot find the value of the password anywhere. But I am not entirely sure.

So here are my questions:

  1. Is this lambda creator method really secure in that password cannot be recovered even if one can access the instance of the Connection?

  2. Is there any “standard paradigm” to deal with such scenarios when a method needs to be called several times with sensitive argument which one does not wish to store?

Thanks in advance.

Jiayao Zhang
  • 170
  • 1
  • 9

0 Answers0