Saya sudah mendapatkan skrip python yang sedang membuat koneksi ODBC. Koneksi ODBC dihasilkan dengan string koneksi. Dalam string koneksi ini saya harus memasukkan nama pengguna dan kata sandi untuk koneksi ini.
Apakah ada cara mudah untuk mengaburkan kata sandi ini di file (hanya saja tidak ada yang bisa membaca kata sandi saat saya mengedit file)?
Jawaban:
Pengkodean Base64 ada di perpustakaan standar dan akan dilakukan untuk menghentikan peselancar bahu:
sumber
base64
mengaburkan lebih baik daripadarot13
dalam konteks ini. Sebaliknya,base64
memiliki ciri khasnya (tanda sama dengan, ...) dan karenanya lebih mudah dideteksi daripada pendekatan lain. Kebingungan apa pun tidak memiliki manfaat praktis. Sangat buruk bahwa jawaban ini sangat diperingkatkan. Itu hanya memberikan perasaan aman yang salah ...base64
ini lebih disukairot13
seperti di perpustakaan standar Python.Douglas F Shearer's adalah solusi yang disetujui secara umum di Unix ketika Anda perlu menentukan kata sandi untuk login jarak jauh.
Anda menambahkan opsi --password-from-file untuk menentukan path dan membaca plaintext dari file.
File kemudian dapat berada di area pengguna sendiri yang dilindungi oleh sistem operasi. Ini juga memungkinkan pengguna yang berbeda untuk secara otomatis mengambil file mereka sendiri.
Untuk kata sandi yang tidak boleh diketahui pengguna skrip - Anda dapat menjalankan skrip dengan izin yang telah dihapus dan memiliki file kata sandi yang dimiliki oleh pengguna root / admin tersebut.
sumber
Ini adalah metode sederhana:
Ini harus sedikit lebih aman daripada decoding base64 - meskipun rentan terhadap dekompiler py_to_pyc.
sumber
import peekabo
kata sandi tersedia sebagaipeekaboo.password
(jika peekaboo.py terkandungpassword='secret'
)cythonizing
skrip Anda dan berbagi biner yang dihasilkan Anda akan mendapat manfaat dari jawaban ini + menambahkan lapisan kebingungan lainnya, karena sekarang Anda telah mendekompilasi kode C untuk mendapatkan kata sandi. Ini tidak 100% aman, tetapi akan membutuhkan banyak tenaga untuk sampai ke data sensitif yang ingin Anda sembunyikan.Jika Anda bekerja pada sistem Unix, manfaatkan modul netrc di pustaka Python standar. Bunyinya kata sandi dari file teks terpisah (.netrc), yang formatnya diuraikan di sini .
Berikut adalah contoh penggunaan kecil:
sumber
Solusi terbaik, dengan asumsi nama pengguna dan kata sandi tidak dapat diberikan pada saat runtime oleh pengguna, mungkin merupakan file sumber terpisah yang hanya berisi inisialisasi variabel untuk nama pengguna dan kata sandi yang diimpor ke kode utama Anda. File ini hanya perlu diedit ketika kredensial berubah. Jika tidak, jika Anda hanya mengkhawatirkan peselancar bahu dengan memori rata-rata, pengkodean basis 64 mungkin merupakan solusi termudah. ROT13 terlalu mudah untuk didekode secara manual, tidak peka huruf besar-kecil dan mempertahankan terlalu banyak makna dalam keadaan terenkripsi. Enkode kata sandi dan ID pengguna Anda di luar skrip python. Apakah dia skrip decode saat runtime untuk digunakan.
Memberikan kredensial skrip untuk tugas otomatis selalu merupakan proposal yang berisiko. Skrip Anda harus memiliki kredensial sendiri dan akun yang digunakannya tidak boleh memiliki akses selain dari apa yang diperlukan. Setidaknya kata sandi harus panjang dan agak acak.
sumber
Bagaimana dengan mengimpor nama pengguna dan kata sandi dari file eksternal ke skrip? Dengan begitu, bahkan jika seseorang memegang skrip, mereka tidak akan secara otomatis mendapatkan kata sandi.
sumber
base64 adalah cara untuk memenuhi kebutuhan sederhana Anda. Tidak perlu mengimpor apa pun:
sumber
untuk kebingungan menggunakan python3
base64
dilakukan secara berbeda:yang mengakibatkan
dan decoding kembali ke string asli
untuk menggunakan hasil ini di mana objek string diperlukan, objek byte dapat diterjemahkan
untuk informasi lebih lanjut tentang bagaimana python3 menangani byte (dan string yang sesuai) silakan lihat dokumentasi resmi .
sumber
Ini adalah masalah yang cukup umum. Biasanya yang terbaik yang dapat Anda lakukan adalah melakukannya
A) membuat semacam fungsi cipher ceasar untuk menyandikan / mendekode (tidak rot13) atau
B) metode yang disukai adalah menggunakan kunci enkripsi, dalam jangkauan program Anda, meng-encode / mendekodekan kata sandi. Di mana Anda dapat menggunakan perlindungan file untuk melindungi akses kunci.
Sejalan dengan itu jika aplikasi Anda berjalan sebagai service / daemon (seperti server web), Anda dapat memasukkan kunci ke dalam keystore yang dilindungi kata sandi dengan input kata sandi sebagai bagian dari startup layanan. Diperlukan admin untuk memulai kembali aplikasi Anda, tetapi Anda akan mendapatkan pretection yang sangat bagus untuk kata sandi konfigurasi Anda.
sumber
Sistem operasi Anda mungkin menyediakan fasilitas untuk mengenkripsi data dengan aman. Misalnya, pada Windows ada DPAPI (API perlindungan data). Mengapa tidak meminta kredensial mereka kepada pengguna pada saat pertama kali Anda menjalankan kemudian membuat mereka dienkripsi untuk proses selanjutnya?
sumber
Lebih banyak appraoch buatan sendiri daripada mengonversi otentikasi / kata sandi / nama pengguna menjadi detail terenkripsi. FTPLIB hanyalah contohnya. " pass.csv " adalah nama file csv
Simpan kata sandi dalam CSV seperti di bawah ini:
nama pengguna
kata sandi pengguna
(Tanpa judul kolom)
Baca CSV dan simpan ke daftar.
Menggunakan daftar elemen sebagai detail authetntication.
Kode lengkap.
sumber
Ini cuplikan saya untuk hal semacam itu. Anda pada dasarnya mengimpor atau menyalin fungsi ke kode Anda. getCredentials akan membuat file terenkripsi jika tidak ada dan mengembalikan kamus, dan updateCredential akan memperbarui.
sumber
Tempatkan informasi konfigurasi dalam file konfigurasi terenkripsi. Permintaan informasi ini dalam kode Anda menggunakan kunci. Tempatkan kunci ini dalam file terpisah per lingkungan, dan jangan menyimpannya dengan kode Anda.
sumber
Apakah Anda tahu lubang?
https://pypi.python.org/pypi/pit (hanya py2 (versi 0.3))
https://github.com/yoshiori/pit (ini akan bekerja pada py3 (versi saat ini 0.4))
test.py
Lari:
~ / .pit / default.yml:
sumber
/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))
Jika berjalan pada Windows, Anda dapat mempertimbangkan menggunakan pustaka win32crypt. Ini memungkinkan penyimpanan dan pengambilan data yang dilindungi (kunci, kata sandi) oleh pengguna yang menjalankan skrip, sehingga kata sandi tidak pernah disimpan dalam teks yang jelas atau format yang dikaburkan dalam kode Anda. Saya tidak yakin apakah ada implementasi yang setara untuk platform lain, jadi dengan penggunaan win32crypt yang ketat, kode Anda tidak portabel.
Saya percaya modul dapat diperoleh di sini: http://timgolden.me.uk/pywin32-docs/win32crypt.html
sumber
Cara yang telah saya lakukan ini adalah sebagai berikut:
Di shell python:
Kemudian, buat modul dengan kode berikut:
Setelah melakukan ini, Anda dapat mengimpor kata sandi langsung atau Anda dapat mengimpor token dan sandi untuk mendekripsi sesuai kebutuhan.
Jelas, ada beberapa kekurangan dalam pendekatan ini. Jika seseorang memiliki token dan kunci (seperti yang mereka lakukan jika mereka memiliki skrip), mereka dapat mendekripsi dengan mudah. Namun itu mengaburkan, dan jika Anda mengkompilasi kode (dengan sesuatu seperti Nuitka) setidaknya kata sandi Anda tidak akan muncul sebagai teks biasa di hex editor.
sumber
Ini tidak tepat menjawab pertanyaan Anda, tetapi terkait. Saya akan menambahkan sebagai komentar tetapi tidak diizinkan. Saya telah menangani masalah yang sama ini, dan kami telah memutuskan untuk mengekspos skrip tersebut kepada pengguna yang menggunakan Jenkins. Ini memungkinkan kami untuk menyimpan kredensial db dalam file terpisah yang dienkripsi dan diamankan di server dan tidak dapat diakses oleh non-admin. Ini juga memungkinkan kita sedikit jalan pintas untuk membuat UI, dan mempercepat eksekusi.
sumber
Anda juga dapat mempertimbangkan kemungkinan menyimpan kata sandi di luar skrip, dan memasoknya saat runtime
mis. fred.py
yang bisa dijalankan seperti
Lapisan tambahan "keamanan melalui ketidakjelasan" dapat dicapai dengan menggunakan
base64
(seperti yang disarankan di atas), menggunakan nama yang kurang jelas dalam kode dan lebih jauh menjauhkan kata sandi yang sebenarnya dari kode.Jika kode ada di repositori, seringkali berguna untuk menyimpan rahasia di luarnya , sehingga orang dapat menambahkan ini ke
~/.bashrc
(atau ke lemari besi, atau skrip peluncuran, ...)dan ubah
fred.py
kelalu masuk kembali dan
sumber
Mengapa tidak memiliki xor sederhana?
Keuntungan:
Saya sampai pada titik di mana saya mengenali string b64 sederhana untuk kata-kata umum dan rot13 juga. Xor akan membuatnya jauh lebih sulit.
sumber
sumber
Ada beberapa utilitas ROT13 yang ditulis dengan Python di 'Net - hanya google untuk mereka. ROT13 menyandikan string secara offline, menyalinnya ke sumber, mendekode pada titik transmisi.
Tapi ini benar - benar perlindungan yang lemah ...
sumber