2013-05-28 17 views
6

Pracuję nad skryptem ze współpracownikiem, który polega na łączeniu się z bazą danych. Chcemy, aby kod był niezależny od tego, który z nas go używa, przy jednoczesnym zachowaniu prywatności naszych haseł i bez konieczności uwierzytelniania w trakcie dnia pracy. Po pewnym wyszukiwaniu (obaj jesteśmy nowicjuszami w Pythonie) wydaje się, że możemy użyć do tego celu kluczyka, więc zainstalowałem go z pip (najprawdopodobniej wersja 1.2.2 biblioteki, bazująca na mojej pamięci daty instalacji).Czy istnieje sposób uzyskania dostępu do kluczy w systemie Windows bez podawania hasła głównego?

Problem polega na tym, że przy próbie uzyskania dostępu do zapisanych haseł, jestem poproszony o ustawienie hasła głównego, aby uzyskać dostęp do bazy kluczy, jak pokazano tutaj (z IDLE):

>>> import keyring 
>>> keyring.set_password('Service', 'MyUsername', 'MyPassword') 

Warning (from warnings module): 
    File "C:\Python27\lib\getpass.py", line 92 
    return fallback_getpass(prompt, stream) 
GetPassWarning: Can not control echo on the terminal. 
Warning: Password input may be echoed. 
Please enter password for encrypted keyring: 

Po ustawieniu hasła, Mogę łatwo uzyskiwać i ustawiać hasła, dopóki nie zrestartuję powłoki. Teraz muszę ponownie wprowadzić hasło główne:

>>> ================================ RESTART ================================ 
>>> import keyring 
>>> print keyring.get_password('Service', 'MyUsername') 

Warning (from warnings module): 
    File "C:\Python27\lib\getpass.py", line 92 
    return fallback_getpass(prompt, stream) 
GetPassWarning: Can not control echo on the terminal. 
Warning: Password input may be echoed. 
Please enter password for encrypted keyring: 

Po wprowadzeniu hasła głównego, to uwierzytelnienie nie ustępuje tylko podczas bieżącej sesji/między ponownym uruchomieniu. Kiedy uruchamiam skrypty z wiersza poleceń, jest jeszcze gorzej - muszę się uwierzytelniać za każdym razem, gdy skrypt jest uruchamiany. W tym momencie keyring nie oszczędza mi czasu ani wysiłku, i wątpię, by moje hasło było bezpieczniejsze niż zapamiętywanie i ręczne wprowadzanie.

Po wyszukaniu rozwiązań wygląda na to, że keyring automatycznie uwierzytelni się w systemie Unix, jeśli hasło główne jest takie samo, jak hasło konta użytkownika, ale to nie działało dla mnie w systemie Windows.

Czy staram się zdobyć brelok do zrobienia czegoś, czego nie powinienem robić, czy jest tylko błąd w mojej implementacji?

Moje doświadczenie wydaje się być sprzeczny z tym zgłoszone przez innego użytkownika (-ów), który twierdzi, że nie jest pytany o hasło, gdy aplikacja próbuje uzyskać dostęp do bazy kluczy w odpowiednim pytaniem How does python-keyring work on Windows?

+0

Nie mam odpowiedzi, ale patrzyłem na podobny problem.Z mojego odczytu dokumentów myślę, że może zaistnieć potrzeba zaimplementowania niestandardowego zaplecza python-keyring (prawdopodobnie z podklasy na keyring.backends.file.BaseKeyring) i nadpisania metod szyfrowania/odszyfrowania do schematu opartego na certyfikacie i skonfigurowania zaplecza do użyj certyfikatu identyfikującego dozwolonego użytkownika – rtmie

+1

Którą wersję klucza używasz? Właśnie pobrałem najnowszy klucz z: https://bitbucket.org/kang/python-keyring-lib/downloads. Próbowałem pod Windows 7 z Python2.7 w IDLE. Nie zgłaszał ostrzeżeń takich jak Ty, ani nie prosił o podanie hasła do zaszyfrowanych kluczy: To po prostu działa dobrze tutaj – ZZY

+0

@ZZY Prawdopodobnie używałem wersji 1.2.2 w czasie pisania tego pytania, ale wkrótce zrezygnowałem i nie używałem go od tego czasu. Wygląda na to, że ten problem nie występuje już w obecnej wersji 3.8 dostępnej przez 'pip'. Dziękuję za czek - jeśli utworzysz odpowiedź, przyznaję nagrodę za nagrodę. – Air

Odpowiedz

1

Które backend używasz ? Sprawdzić za pomocą:

>>> from keyring import get_keyring 
>>> get_keyring() 
[... what is output here?] 

Jeśli wyprowadza to:

<keyring.backends.file.EncryptedKeyring object at 0x.....> 

Wtedy właśnie dlatego to z prośbą o hasło. Moduł nie znalazł odpowiedniego klucza do platformy, więc zamiast tego po prostu szyfruje hasła przy użyciu hasła głównego i umieszcza je w zwykłym pliku.

Osobiście to dla mnie ważniejsze, że moje skrypty uruchamiane bez nadzoru niż moje hasła są bezpieczne, więc napisałem tę funkcję:

def configureKeyring(): 
    """ 
    EncryptedKeyring requires a master password to unlock it, which is not ideal 
    for our scripts since we want them to run unattended. So if we're using 
    EncryptedKeyring, automatically swap to a PlaintextKeyring instead. 

    If we're using something else, say WinVaultKeyring, then that's more secure 
    than PlaintextKeyring without being any less convenient, so we'll use it. 
    """ 
    from keyring    import get_keyring, set_keyring 
    from keyring.backends.file import EncryptedKeyring, PlaintextKeyring 

    if isinstance(get_keyring(), EncryptedKeyring): 
     set_keyring(PlaintextKeyring()) 

Przed użyciem keyring do set_password lub get_password uruchomić tę funkcję configureKeyring(), jeśli, tak jak ja, nie warto wstawiać hasła głównego, aby zachować bezpieczeństwo swoich haseł. Zanim to zrobisz, zapoznaj się z implikacjami związanymi z bezpieczeństwem, w których przechowujesz hasła w postaci zwykłego tekstu.

Lepszym długoterminowym rozwiązaniem jest prawdopodobnie zbadanie wszystkich dostępnych dostępnych serwerów i zainstalowanie odpowiednich wcześniejszych wymagań, aby można było użyć innego, jeśli istnieje, gdy nie trzeba wprowadzać głównego hasła i po prostu zalogowanie jest wystarczające.

+0

Nieparzyste, ale nie ma pliku backends.file. Istnieje backends.SecretService i inne. Ale nie domyśliłem się, jak ustawić je jako domyślny brelok. Nie ma funkcji PlaintextKeyring, chociaż 'backend.get_all_keyring()' dostarcza mi '[ /.local/share/python_keyring/keyring_pass.cfg>, , /.local/share/python_keyring/crypted_pass.cfg>] – antonavy

Powiązane problemy