Mam skrypt w Pythonie, który tworzy połączenie ODBC. Połączenie ODBC jest generowane za pomocą parametrów połączenia. W tym ciągu połączenia muszę podać nazwę użytkownika i hasło dla tego połączenia.
Czy istnieje łatwy sposób na ukrycie tego hasła w pliku (tylko, że nikt nie może odczytać hasła podczas edycji pliku)?
Odpowiedzi:
Kodowanie Base64 znajduje się w standardowej bibliotece i powstrzyma surferów:
źródło
base64
jest to lepsze zaciemnianie niżrot13
w tym kontekście. Wręcz przeciwnie,base64
ma swoje typowe cechy (znak równości, ...) i dlatego jest łatwiejszy do wykrycia niż inne podejścia. Jednak jakiekolwiek zaciemnianie nie przynosi żadnych praktycznych korzyści. Naprawdę źle, że ta odpowiedź jest tak wysoko oceniana. Po prostu daje fałszywe poczucie bezpieczeństwa ...base64
jest lepszerot13
niż w standardowej bibliotece Pythona.Douglas F Shearer jest ogólnie akceptowanym rozwiązaniem w systemie Unix, gdy trzeba określić hasło do zdalnego logowania.
Dodasz --password-z-pliku opcji, aby określić ścieżkę i czytać tekst jawny z pliku.
Plik może wtedy znajdować się w obszarze użytkownika chronionym przez system operacyjny. Umożliwia również różnym użytkownikom automatyczne pobieranie własnego pliku.
W przypadku haseł, których użytkownik skryptu nie może znać - możesz uruchomić skrypt z podwyższonymi uprawnieniami i mieć plik haseł, którego właścicielem jest ten użytkownik root / admin.
źródło
Oto prosta metoda:
Powinno to być nieco bezpieczniejsze niż dekodowanie base64 - chociaż jest podatne na działanie dekompilatora py_to_pyc.
źródło
import peekabo
hasło jest dostępne jakopeekaboo.password
(jeśli zawiera peekaboo.pypassword='secret'
)cythonizing
skryptu i udostępniając wygenerowany plik binarny, uzyskasz korzyść z tej odpowiedzi + dodaj kolejną warstwę zaciemniania, ponieważ teraz masz zdekompilowany kod C, aby dostać się do hasła. Nie jest to w 100% bezpieczne, ale uzyskanie poufnych danych, które chcesz ukryć, będzie wymagało dużo pracy.Jeśli pracujesz w systemie Unix, skorzystaj z modułu netrc w standardowej bibliotece Pythona. Odczytuje hasła z oddzielnego pliku tekstowego (.netrc), którego format jest opisany tutaj .
Oto mały przykład użycia:
źródło
Najlepszym rozwiązaniem, przy założeniu, że nazwa użytkownika i hasło nie mogą być podane w czasie wykonywania przez użytkownika, jest prawdopodobnie oddzielny plik źródłowy zawierający tylko inicjalizację zmiennej dla nazwy użytkownika i hasła, które są importowane do głównego kodu. Ten plik wymagałby edycji tylko w przypadku zmiany poświadczeń. W przeciwnym razie, jeśli martwisz się tylko o surferów naramiennych ze średnią pamięcią, kodowanie base 64 jest prawdopodobnie najłatwiejszym rozwiązaniem. ROT13 jest po prostu zbyt łatwy do zdekodowania ręcznie, nie rozróżnia wielkości liter i zachowuje zbyt duże znaczenie w stanie zaszyfrowanym. Zakoduj swoje hasło i identyfikator użytkownika poza skryptem Pythona. Niech on dekoduje skrypt w czasie wykonywania do użycia.
Nadawanie skryptom danych uwierzytelniających do zadań automatycznych jest zawsze ryzykowną propozycją. Twój skrypt powinien mieć własne poświadczenia, a konto, którego używa, nie powinno mieć dostępu innego niż dokładnie to, co jest konieczne. Przynajmniej hasło powinno być długie i raczej losowe.
źródło
Co powiesz na zaimportowanie nazwy użytkownika i hasła z pliku zewnętrznego względem skryptu? W ten sposób, nawet jeśli ktoś zdobyłby skrypt, nie otrzymałby automatycznie hasła.
źródło
base64 to sposób na zaspokojenie twoich prostych potrzeb. Nie ma potrzeby importowania niczego:
źródło
w przypadku zaciemniania python3 użycie
base64
jest wykonywane inaczej:Co skutkuje w
i dekodowanie z powrotem do oryginalnego ciągu
aby użyć tego wyniku, gdy wymagane są obiekty łańcuchowe, obiekt bajtów można przetłumaczyć
Aby uzyskać więcej informacji o tym, jak python3 obsługuje bajty (i odpowiednie ciągi znaków), zapoznaj się z oficjalną dokumentacją .
źródło
To dość powszechny problem. Zazwyczaj najlepsze, co możesz zrobić, to jedno lub drugie
A) stworzyć jakąś funkcję szyfrującą Cezara do kodowania / dekodowania (tylko nie rot13) lub
B) Preferowaną metodą jest użycie klucza szyfrowania, w zasięgu twojego programu, zakodowanie / odkodowanie hasła. W którym możesz użyć ochrony plików, aby zabezpieczyć dostęp do klucza.
Wzdłuż tych linii, jeśli Twoja aplikacja działa jako usługa / demon (jak serwer WWW), możesz umieścić swój klucz w chronionym hasłem magazynie kluczy, wprowadzając hasło podczas uruchamiania usługi. Ponowne uruchomienie aplikacji zajmie administrator, ale będziesz mieć naprawdę dobrą ochronę haseł konfiguracyjnych.
źródło
Twój system operacyjny prawdopodobnie zapewnia funkcje do bezpiecznego szyfrowania danych. Na przykład w systemie Windows istnieje DPAPI (API ochrony danych). Dlaczego nie poprosić użytkownika o ich poświadczenia przy pierwszym uruchomieniu, a następnie wyrzucić je zaszyfrowane do kolejnych uruchomień?
źródło
Bardziej domowa ocena zamiast konwersji uwierzytelniania / haseł / nazwy użytkownika na zaszyfrowane szczegóły. FTPLIB to tylko przykład. " pass.csv ” to nazwa pliku csv
Zapisz hasło w CSV, jak poniżej:
Nazwa Użytkownika
hasło użytkownika
(Bez nagłówka kolumny)
Czytanie pliku CSV i zapisywanie go na liście.
Używanie elementów listy jako szczegółów uwierzytelniania.
Pełny kod.
źródło
Oto mój fragment na taką rzecz. Zasadniczo importujesz lub kopiujesz funkcję do swojego kodu. getCredentials utworzy zaszyfrowany plik, jeśli nie istnieje i zwróci dictionaty, a updateCredential zostanie zaktualizowany.
źródło
Umieść informacje konfiguracyjne w zaszyfrowanym pliku konfiguracyjnym. Zapytaj o te informacje w swoim kodzie za pomocą klucza. Umieść ten klucz w osobnym pliku dla każdego środowiska i nie przechowuj go z kodem.
źródło
Czy znasz pit?
https://pypi.python.org/pypi/pit (tylko py2 (wersja 0.3))
https://github.com/yoshiori/pit (będzie działać na py3 (aktualna wersja 0.4))
test.py
Biegać:
~ / .pit / default.yml:
źródło
/usr/lib/python3.7/site-packages/pit.py:93: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. return yaml.load(open(Pit._config))
Jeśli pracujesz w systemie Windows, możesz rozważyć użycie biblioteki win32crypt. Umożliwia przechowywanie i odzyskiwanie chronionych danych (kluczy, haseł) przez użytkownika, który uruchamia skrypt, dzięki czemu hasła nigdy nie są przechowywane w postaci zwykłego tekstu lub zaciemnionego w kodzie. Nie jestem pewien, czy istnieje równoważna implementacja dla innych platform, więc przy ścisłym użyciu win32crypt twój kod nie jest przenośny.
Myślę, że moduł można uzyskać tutaj: http://timgolden.me.uk/pywin32-docs/win32crypt.html
źródło
Sposób, w jaki to zrobiłem, jest następujący:
W powłoce Pythona:
Następnie utwórz moduł z następującym kodem:
Gdy to zrobisz, możesz albo bezpośrednio zaimportować moje hasło, albo możesz zaimportować token i szyfr w celu odszyfrowania w razie potrzeby.
Oczywiście podejście to ma pewne wady. Jeśli ktoś ma zarówno token, jak i klucz (tak jak gdyby miał skrypt), może łatwo odszyfrować. Jednak powoduje to zaciemnienie i jeśli skompilujesz kod (za pomocą czegoś takiego jak Nuitka), przynajmniej twoje hasło nie pojawi się jako zwykły tekst w edytorze szesnastkowym.
źródło
To nie jest dokładną odpowiedzią na twoje pytanie, ale jest powiązane. Zamierzałem dodać jako komentarz, ale nie pozwolono mi. Miałem do czynienia z tym samym problemem i zdecydowaliśmy się udostępnić skrypt użytkownikom korzystającym z Jenkinsa. Dzięki temu możemy przechowywać poświadczenia bazy danych w oddzielnym pliku, który jest zaszyfrowany i zabezpieczony na serwerze i niedostępny dla osób niebędących administratorami. Daje nam także trochę skrótu do tworzenia interfejsu użytkownika i ograniczania wykonywania.
źródło
Można również rozważyć możliwość przechowywania hasła poza skryptem i dostarczania go w czasie wykonywania
np. fred.py
które można uruchomić jak
Dodatkowe warstwy „bezpieczeństwa poprzez zaciemnienie” można osiągnąć za pomocą
base64
(jak zasugerowano powyżej), używając mniej oczywistych nazw w kodzie i jeszcze bardziej oddalając rzeczywiste hasło od kodu.Jeśli kod znajduje się w repozytorium, często warto przechowywać sekrety poza nim , więc można go dodać do
~/.bashrc
(lub do skarbca lub skryptu uruchamiania, ...)i zmień
fred.py
nanastępnie zaloguj się ponownie i
źródło
Dlaczego nie mieć prostego xora?
Zalety:
Dochodzę do punktu, w którym rozpoznaję proste ciągi b64 dla popularnych słów i również rot13. Xor znacznie utrudniłby sprawę.
źródło
źródło
W sieci jest kilka narzędzi ROT13 napisanych w Pythonie - po prostu wygoogluj je. ROT13 koduje ciąg w trybie offline, kopiuje go do źródła, dekoduje w miejscu transmisji.
Ale to jest naprawdę słaba ochrona ...
źródło