मुझे पायथन में उपयोगकर्ता नाम और पासवर्ड को सुरक्षित रूप से संग्रहीत करने की आवश्यकता है, मेरे विकल्प क्या हैं?


96

मैं एक छोटी पायथन स्क्रिप्ट लिख रहा हूं जो समय-समय पर उपयोगकर्ता नाम और पासवर्ड कॉम्बो का उपयोग करके 3 जी सेवा से जानकारी खींच लेगी। मुझे कुछ ऐसा बनाने की आवश्यकता नहीं है जो 100% बुलेटप्रूफ है (क्या 100% भी मौजूद है?), लेकिन मैं सुरक्षा का एक अच्छा उपाय शामिल करना चाहता हूं, इसलिए बहुत कम से कम किसी को इसे तोड़ने में लंबा समय लगेगा।

इस स्क्रिप्ट में GUI नहीं होगा और समय cron-समय पर इसे चलाया जाएगा , इसलिए हर बार जब यह चीजों को डिक्रिप्ट करने के लिए चलाया जाता है तो एक पासवर्ड दर्ज करना वास्तव में काम नहीं करेगा, और मुझे उपयोगकर्ता नाम और पासवर्ड को एक एन्क्रिप्टेड फ़ाइल या एन्क्रिप्टेड में स्टोर करना होगा एक SQLite डेटाबेस में, जो बेहतर होगा क्योंकि मैं वैसे भी SQLite का उपयोग करूंगा, और मुझे किसी बिंदु पर पासवर्ड को संपादित करने की आवश्यकता हो सकती है। इसके अलावा, मैं शायद पूरे कार्यक्रम को एक EXE में लपेटूंगा, क्योंकि यह इस बिंदु पर विंडोज के लिए विशेष रूप से है।

मैं cronनौकरी के माध्यम से समय-समय पर उपयोग किए जाने वाले उपयोगकर्ता नाम और पासवर्ड कॉम्बो को सुरक्षित रूप से कैसे स्टोर कर सकता हूं ?


इसे भी देखें : stackoverflow.com/questions/157938
dreftymac

जवाबों:


19

मैं ssh-Agent के समान रणनीति की सलाह देता हूं । यदि आप सीधे ssh-Agent का उपयोग नहीं कर सकते हैं तो आप कुछ ऐसा लागू कर सकते हैं, जिससे आपका पासवर्ड केवल RAM में रखा जाए। क्रॉन जॉब में हर बार चलने वाले एजेंट से वास्तविक पासवर्ड प्राप्त करने के लिए क्रेडेंशियल कॉन्फ़िगर किया जा सकता था, इसे एक बार उपयोग करें, और तुरंत delस्टेटमेंट का उपयोग करके इसे डी- रेफर करें।

प्रशासक को अभी भी ssh-Agent को बूट-टाइम या जो कुछ भी शुरू करने के लिए पासवर्ड दर्ज करना है, लेकिन यह एक उचित समझौता है जो डिस्क पर कहीं भी सादा-पाठ पासवर्ड रखने से बचता है।


2
+1, यह बहुत मायने रखता है। मैं हमेशा इसके लिए एक यूआई बना सकता था जो अनिवार्य रूप से बूट पर पासवर्ड के लिए उपयोगकर्ता से पूछता है, इस तरह यह कभी भी डिस्क पर संग्रहीत नहीं होता है और चुभने वाली आंखों से सुरक्षित होता है।
नफुटुली के

54

अजगर पुस्तकालय कीरिंग से जुड़ता है CryptProtectDataविंडोज पर एपीआई जो उपयोगकर्ता के लॉग ऑन क्रेडेंशियल्स के साथ आंकड़ों को कूट (मैक और लिनक्स पर प्रासंगिक एपीआई के साथ)।

सरल उपयोग:

import keyring

# the service is just a namespace for your app
service_id = 'IM_YOUR_APP!'

keyring.set_password(service_id, 'dustin', 'my secret password')
password = keyring.get_password(service_id, 'dustin') # retrieve password

यदि आप उपयोगकर्ता नाम को कीरिंग पर संग्रहीत करना चाहते हैं तो उपयोग करें:

import keyring

MAGIC_USERNAME_KEY = 'im_the_magic_username_key'

# the service is just a namespace for your app
service_id = 'IM_YOUR_APP!'  

username = 'dustin'

# save password
keyring.set_password(service_id, username, "password")

# optionally, abuse `set_password` to save username onto keyring
# we're just using some known magic string in the username field
keyring.set_password(service_id, MAGIC_USERNAME_KEY, username)

बाद में कीरिंग से अपनी जानकारी प्राप्त करें

# again, abusing `get_password` to get the username.
# after all, the keyring is just a key-value store
username = keyring.get_password(service_id, MAGIC_USERNAME_KEY)
password = keyring.get_password(service_id, username)  

आइटम उपयोगकर्ता के ऑपरेटिंग सिस्टम क्रेडेंशियल्स के साथ एन्क्रिप्ट किए गए हैं, इस प्रकार आपके उपयोगकर्ता खाते में चल रहे अन्य एप्लिकेशन पासवर्ड का उपयोग करने में सक्षम होंगे।

उस भेद्यता को अस्पष्ट करने के लिए, आप कीरिंग पर संग्रहीत करने से पहले पासवर्ड को किसी तरह से एन्क्रिप्ट / बाधित कर सकते हैं। बेशक, जो कोई भी आपकी स्क्रिप्ट को लक्षित कर रहा था, वह केवल स्रोत को देख सकेगा और यह पता लगा सकेगा कि पासवर्ड को अनइंक्रिप्ट / अनबॉस्फेट कैसे किया जाए, लेकिन आप कम से कम कुछ एप्लिकेशन को तिजोरी में सभी पासवर्डों को वैक्यूम करने से रोक सकते हैं और आपका प्राप्त कर सकते हैं। ।


उपयोगकर्ता नाम कैसे संग्रहीत किया जाना चाहिए? क्या keyringयूज़रनेम और पासवर्ड दोनों को प्राप्त करने का समर्थन करता है ?
Stevoisiak

1
@DustinWyatt get_passwordउपयोगकर्ता नाम के लिए चतुर उपयोग । हालांकि, मुझे लगता है कि आपको उत्तर का मूल सरलीकृत उदाहरण के साथ जवाब देना शुरू करना चाहिए keyring.set_password()औरkeyring.get_password()
स्टिवोइसक

keyringअजगर मानक पुस्तकालय का हिस्सा नहीं है
Ciasto piekarz

@Ciastopiekarz ने उत्तर के बारे में कुछ किया जिससे आपको विश्वास हो जाए कि यह मानक पुस्तकालय का हिस्सा था?
डस्टिन व्याट

क्या keyringलॉग और मेमोरी आफ्टरवर्ड से पासवर्ड को सुरक्षित रूप से स्क्रब किया जाता है?
केबमन

26

हालांकि इस और संबंधित सवालों के जवाब देखने के बाद, मैंने गुप्त डेटा को एन्क्रिप्ट और अस्पष्ट करने के लिए कुछ सुझाए गए तरीकों का उपयोग करके कुछ कोड को एक साथ रखा है। यह कोड विशेष रूप से तब होता है जब स्क्रिप्ट को उपयोगकर्ता के हस्तक्षेप के बिना चलना होता है (यदि उपयोगकर्ता इसे मैन्युअल रूप से शुरू करता है, तो उन्हें पासवर्ड में रखना सबसे अच्छा है और केवल इसे स्मृति में रखें क्योंकि इस प्रश्न का उत्तर सुझाता है)। यह विधि अति-सुरक्षित नहीं है; मूल रूप से, स्क्रिप्ट गुप्त जानकारी तक पहुंच सकती है, इसलिए जिस किसी के पास पूर्ण सिस्टम एक्सेस है, उसके पास स्क्रिप्ट और उससे जुड़ी फाइलें हैं और वे उन तक पहुंच सकते हैं। यह क्या करता है आईडी आकस्मिक निरीक्षण से डेटा को अस्पष्ट करता है और डेटा फ़ाइलों को खुद को सुरक्षित छोड़ देता है यदि वे व्यक्तिगत रूप से जांच की जाती हैं, या स्क्रिप्ट के बिना एक साथ।

इसके लिए मेरी प्रेरणा एक ऐसी परियोजना है जो लेन-देन की निगरानी करने के लिए मेरे कुछ बैंक खातों को प्रदूषित करती है - मुझे हर दो या दो मिनट में पासवर्ड दोबारा दर्ज किए बिना पृष्ठभूमि में चलने की आवश्यकता है।

इस कोड को अपनी स्क्रिप्ट के शीर्ष पर चिपकाएं, नमक को बदल दें और फिर स्टोर () को पुनः प्राप्त करें (और आवश्यकता के अनुसार) का उपयोग करें:

from getpass import getpass
from pbkdf2 import PBKDF2
from Crypto.Cipher import AES
import os
import base64
import pickle


### Settings ###

saltSeed = 'mkhgts465wef4fwtdd' # MAKE THIS YOUR OWN RANDOM STRING

PASSPHRASE_FILE = './secret.p'
SECRETSDB_FILE = './secrets'
PASSPHRASE_SIZE = 64 # 512-bit passphrase
KEY_SIZE = 32 # 256-bit key
BLOCK_SIZE = 16  # 16-bit blocks
IV_SIZE = 16 # 128-bits to initialise
SALT_SIZE = 8 # 64-bits of salt


### System Functions ###

def getSaltForKey(key):
    return PBKDF2(key, saltSeed).read(SALT_SIZE) # Salt is generated as the hash of the key with it's own salt acting like a seed value

def encrypt(plaintext, salt):
    ''' Pad plaintext, then encrypt it with a new, randomly initialised cipher. Will not preserve trailing whitespace in plaintext!'''

    # Initialise Cipher Randomly
    initVector = os.urandom(IV_SIZE)

    # Prepare cipher key:
    key = PBKDF2(passphrase, salt).read(KEY_SIZE)

    cipher = AES.new(key, AES.MODE_CBC, initVector) # Create cipher

    return initVector + cipher.encrypt(plaintext + ' '*(BLOCK_SIZE - (len(plaintext) % BLOCK_SIZE))) # Pad and encrypt

def decrypt(ciphertext, salt):
    ''' Reconstruct the cipher object and decrypt. Will not preserve trailing whitespace in the retrieved value!'''

    # Prepare cipher key:
    key = PBKDF2(passphrase, salt).read(KEY_SIZE)

    # Extract IV:
    initVector = ciphertext[:IV_SIZE]
    ciphertext = ciphertext[IV_SIZE:]

    cipher = AES.new(key, AES.MODE_CBC, initVector) # Reconstruct cipher (IV isn't needed for edecryption so is set to zeros)

    return cipher.decrypt(ciphertext).rstrip(' ') # Decrypt and depad


### User Functions ###

def store(key, value):
    ''' Sore key-value pair safely and save to disk.'''
    global db

    db[key] = encrypt(value, getSaltForKey(key))
    with open(SECRETSDB_FILE, 'w') as f:
        pickle.dump(db, f)

def retrieve(key):
    ''' Fetch key-value pair.'''
    return decrypt(db[key], getSaltForKey(key))

def require(key):
    ''' Test if key is stored, if not, prompt the user for it while hiding their input from shoulder-surfers.'''
    if not key in db: store(key, getpass('Please enter a value for "%s":' % key))


### Setup ###

# Aquire passphrase:
try:
    with open(PASSPHRASE_FILE) as f:
        passphrase = f.read()
    if len(passphrase) == 0: raise IOError
except IOError:
    with open(PASSPHRASE_FILE, 'w') as f:
        passphrase = os.urandom(PASSPHRASE_SIZE) # Random passphrase
        f.write(base64.b64encode(passphrase))

        try: os.remove(SECRETSDB_FILE) # If the passphrase has to be regenerated, then the old secrets file is irretrievable and should be removed
        except: pass
else:
    passphrase = base64.b64decode(passphrase) # Decode if loaded from already extant file

# Load or create secrets database:
try:
    with open(SECRETSDB_FILE) as f:
        db = pickle.load(f)
    if db == {}: raise IOError
except (IOError, EOFError):
    db = {}
    with open(SECRETSDB_FILE, 'w') as f:
        pickle.dump(db, f)

### Test (put your code here) ###
require('id')
require('password1')
require('password2')
print
print 'Stored Data:'
for key in db:
    print key, retrieve(key) # decode values on demand to avoid exposing the whole database in memory
    # DO STUFF

इस विधि की सुरक्षा में काफी सुधार होगा अगर ओएस फाइलों को गुप्त अनुमतियों पर सेट किया गया था, केवल स्क्रिप्ट को उन्हें पढ़ने के लिए अनुमति देने के लिए, और यदि स्क्रिप्ट को केवल संकलित किया गया था और केवल निष्पादन योग्य (पठनीय नहीं) के रूप में चिह्नित किया गया था। इनमें से कुछ को स्वचालित किया जा सकता था, लेकिन मैंने परेशान नहीं किया। यह संभवतः स्क्रिप्ट के लिए एक उपयोगकर्ता की स्थापना और स्क्रिप्ट को उस उपयोगकर्ता के रूप में चलाने की आवश्यकता होगी (और उस उपयोगकर्ता के लिए स्क्रिप्ट की फ़ाइलों का स्वामित्व सेट करना)।

मैं किसी भी सुझाव, आलोचनाओं या भेद्यता के अन्य बिंदुओं को पसंद करूंगा जो कोई भी सोच सकता है। मैं क्रिप्टो कोड लिखने के लिए बहुत नया हूं इसलिए मैंने जो किया है वह लगभग निश्चित रूप से बेहतर हो सकता है।


25

पासवर्ड और अन्य रहस्यों को संग्रहीत करने के लिए कुछ विकल्प हैं जिन्हें पायथन प्रोग्राम का उपयोग करने की आवश्यकता है, विशेष रूप से एक प्रोग्राम जिसे पृष्ठभूमि में चलाने की आवश्यकता है जहां यह उपयोगकर्ता को पासवर्ड टाइप करने के लिए नहीं कह सकता है।

समस्याओं से बचने के लिए:

  1. पासवर्ड को स्रोत नियंत्रण में जाँचना जहां अन्य डेवलपर्स या यहां तक ​​कि जनता इसे देख सकती है।
  2. एक कॉन्फ़िगरेशन फ़ाइल या स्रोत कोड से पासवर्ड पढ़ने वाले एक ही सर्वर पर अन्य उपयोगकर्ता।
  3. किसी स्रोत फ़ाइल में पासवर्ड होने से जहाँ आप इसे संपादित कर रहे हैं, वहीं अन्य इसे अपने कंधे पर देख सकते हैं।

विकल्प 1: एसएसएच

यह हमेशा एक विकल्प नहीं है, लेकिन यह शायद सबसे अच्छा है। आपकी निजी कुंजी कभी भी नेटवर्क पर प्रसारित नहीं होती है, SSH सिर्फ यह साबित करने के लिए गणितीय गणना करता है कि आपके पास सही कुंजी है।

इसे काम करने के लिए, आपको निम्नलिखित की आवश्यकता होगी:

  • डेटाबेस या आप जो भी एक्सेस कर रहे हैं, उसे SSH द्वारा एक्सेस करने की आवश्यकता है। "एसएसएच" के लिए खोज करें जो भी सेवा आप एक्सेस कर रहे हैं। उदाहरण के लिए, "ssh postgresql" । यदि आपके डेटाबेस में यह सुविधा नहीं है, तो अगले विकल्प पर जाएँ।
  • उस सेवा को चलाने के लिए एक खाता बनाएं जो डेटाबेस को कॉल करेगा, और एक एसएसएच कुंजी उत्पन्न करेगा
  • या तो उस सेवा में सार्वजनिक कुंजी जोड़ें जिसे आप कॉल करने जा रहे हैं, या उस सर्वर पर एक स्थानीय खाता बनाएं, और वहां सार्वजनिक कुंजी स्थापित करें।

विकल्प 2: पर्यावरण चर

यह सबसे सरल है, इसलिए यह शुरू करने के लिए एक अच्छी जगह हो सकती है। यह बारह फैक्टर ऐप में अच्छी तरह से वर्णित है । मूल विचार यह है कि आपका स्रोत कोड केवल पर्यावरण चर से पासवर्ड या अन्य रहस्यों को खींचता है, और फिर आप प्रत्येक सिस्टम पर उन पर्यावरण चर को कॉन्फ़िगर करते हैं जहां आप प्रोग्राम चलाते हैं। यदि आप डिफ़ॉल्ट मान का उपयोग करते हैं तो यह एक अच्छा स्पर्श भी हो सकता है जो अधिकांश डेवलपर्स के लिए काम करेगा। आपको अपने सॉफ़्टवेयर को "डिफ़ॉल्ट रूप से सुरक्षित" बनाने के विरुद्ध संतुलन बनाना होगा।

यहां एक उदाहरण है जो पर्यावरण चर से सर्वर, उपयोगकर्ता नाम और पासवर्ड को खींचता है।

import os

server = os.getenv('MY_APP_DB_SERVER', 'localhost')
user = os.getenv('MY_APP_DB_USER', 'myapp')
password = os.getenv('MY_APP_DB_PASSWORD', '')

db_connect(server, user, password)

अपने ऑपरेटिंग सिस्टम में पर्यावरण चर कैसे सेट करें, और अपने खाते के तहत सेवा चलाने पर विचार करें। जब आप अपने खाते में प्रोग्राम चलाते हैं तो इस तरह से आपके पास पर्यावरण चर में संवेदनशील डेटा नहीं होता है। जब आप उन पर्यावरण चर को सेट करते हैं, तो अतिरिक्त ध्यान रखें कि अन्य उपयोगकर्ता उन्हें नहीं पढ़ सकते हैं। उदाहरण के लिए फ़ाइल अनुमतियों की जाँच करें। बेशक रूट अनुमति वाले कोई भी उपयोगकर्ता उन्हें पढ़ पाएंगे, लेकिन उनकी मदद नहीं की जा सकती।

विकल्प 3: कॉन्फ़िगरेशन फ़ाइलें

यह पर्यावरण चर के समान है, लेकिन आप पाठ फ़ाइल के रहस्यों को पढ़ते हैं। मुझे अभी भी तैनाती के उपकरण और निरंतर एकीकरण सर्वर जैसी चीजों के लिए पर्यावरण चर अधिक लचीला लगता है। यदि आप एक कॉन्फ़िगरेशन फ़ाइल का उपयोग करने का निर्णय लेते हैं, तो पायथन मानक लाइब्रेरी में कई स्वरूपों का समर्थन करता है, जैसे JSON , INI , netrc , और XML । आप PyYAML और TOML जैसे बाहरी पैकेज भी पा सकते हैं । व्यक्तिगत रूप से, मुझे JSON और YAML का उपयोग करने के लिए सबसे सरल लगता है, और YAML टिप्पणियों की अनुमति देता है।

कॉन्फ़िगरेशन फ़ाइलों के साथ विचार करने के लिए तीन चीजें:

  1. फाइल कहां है? हो सकता है कि एक ~/.my_appअलग स्थान का उपयोग करने के लिए एक डिफ़ॉल्ट स्थान , और एक कमांड-लाइन विकल्प।
  2. सुनिश्चित करें कि अन्य उपयोगकर्ता फ़ाइल नहीं पढ़ सकते हैं।
  3. जाहिर है, स्रोत कोड के लिए कॉन्फ़िगरेशन फ़ाइल प्रतिबद्ध नहीं है। आप ऐसा टेम्प्लेट करना चाहते हैं जिसे उपयोगकर्ता अपने होम डायरेक्टरी में कॉपी कर सकें।

विकल्प 4: पायथन मॉड्यूल

कुछ परियोजनाओं ने अपने रहस्यों को ठीक पायथन मॉड्यूल में डाल दिया।

# settings.py
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'

फिर मान प्राप्त करने के लिए उस मॉड्यूल को आयात करें।

# my_app.py
from settings import db_server, db_user, db_password

db_connect(db_server, db_user, db_password)

इस तकनीक का उपयोग करने वाला एक प्रोजेक्ट Django है । जाहिर है, आपको settings.pyस्रोत नियंत्रण के लिए प्रतिबद्ध नहीं होना चाहिए , हालांकि आप एक फाइल करना चाहते हैं जिसे settings_template.pyउपयोगकर्ता कॉपी और संशोधित कर सकते हैं।

मैं इस तकनीक के साथ कुछ समस्याओं को देखता हूं:

  1. डेवलपर्स गलती से फ़ाइल को स्रोत नियंत्रण के लिए प्रतिबद्ध कर सकते हैं। इसे जोड़ना .gitignoreउस जोखिम को कम करता है।
  2. आपका कुछ कोड स्रोत नियंत्रण में नहीं है। यदि आप अनुशासित हैं और केवल तार और संख्याएँ यहाँ डालते हैं, तो यह समस्या नहीं होगी। यदि आप यहां लॉगिंग फिल्टर क्लासेस लिखना शुरू करते हैं, तो रुकें!

यदि आपकी परियोजना पहले से ही इस तकनीक का उपयोग करती है, तो पर्यावरण चर के लिए संक्रमण करना आसान है। बस पर्यावरण चर के लिए सभी सेटिंग मानों को स्थानांतरित करें, और उन पर्यावरण चर से पढ़ने के लिए पायथन मॉड्यूल को बदलें।


नमस्कार। यदि आपकी परियोजना पहले से ही इस तकनीक का उपयोग करती है, तो पर्यावरण चर के लिए संक्रमण करना आसान है। मुझे पता है कि विंडोज 10 में पर्यावरण चर को मैन्युअल रूप से कैसे सेट किया जाए, लेकिन उपयोग करके मेरे अजगर कोड से उन्हें एक्सेस कर सकते हैं os.getenv()। यदि कोड साझा किया जा रहा है तो हमें यह कैसे करना चाहिए? यदि कोड किसी अन्य डेवलपर द्वारा डाउनलोड किया गया है, तो उसे कैसे सुनिश्चित करना चाहिए कि उसके लिए पर्यावरण चर पहले से ही निर्धारित हैं?
a_sid

मैं os.getenv()@a_sid को एक उचित डिफ़ॉल्ट मान देने की कोशिश करता हूं, इसलिए कोड कम से कम ऐसे उपयोगकर्ता के लिए चलेगा जिसने पर्यावरण चर नहीं बनाया है। यदि कोई अच्छा डिफ़ॉल्ट मान नहीं है, तो मिलने पर एक स्पष्ट त्रुटि बढ़ाएं None। इसके अलावा, सेटिंग फ़ाइल में स्पष्ट टिप्पणियां डालें। अगर मुझे कुछ गलत लगा, तो मेरा सुझाव है कि आप एक अलग सवाल पूछें।
डॉन किर्कबी

8

पासवर्ड को एन्क्रिप्ट करने की कोशिश करने के लिए बहुत कुछ नहीं है: जिस व्यक्ति से आप इसे छिपाने की कोशिश कर रहे हैं, उसके पास पायथन स्क्रिप्ट है, जिसमें इसे डिक्रिप्ट करने के लिए कोड होगा। पासवर्ड प्राप्त करने का सबसे तेज़ तरीका तीसरे पक्ष की सेवा के साथ पासवर्ड का उपयोग करने से ठीक पहले पायथन स्क्रिप्ट में एक प्रिंट स्टेटमेंट जोड़ना होगा।

इसलिए स्क्रिप्ट में एक स्ट्रिंग के रूप में पासवर्ड को स्टोर करें, और बेस 64 इसे एनकोड करें ताकि फ़ाइल को पढ़ना पर्याप्त न हो, फिर उसे एक दिन कॉल करें।


मुझे समय-समय पर उपयोगकर्ता नाम और पासवर्ड को संपादित करने की आवश्यकता होगी और मैं विंडोएज के लिए एक एक्सई में पूरी चीज लपेटूंगा; मैंने इसे प्रतिबिंबित करने के लिए पोस्ट को संपादित किया है। जहाँ भी मैं इसे स्टोर करने का काम करता हूँ, क्या मुझे बस इसे आधार बनाना चाहिए?
Naftuli Kay

मैं सहमत हूं कि पासवर्ड को "एन्क्रिप्ट करना" मदद नहीं करता है, क्योंकि सादा-पाठ पासवर्ड को वैसे भी एक स्वचालित फैशन में प्राप्त किया जाना चाहिए, और इसलिए जो कुछ भी संग्रहीत किया जाता है, उससे प्राप्त होना चाहिए। लेकिन व्यवहार्य दृष्टिकोण हैं।
18

सोचा कि मैंने आपका नाम पहचाना, आप TalkPython पर शुरुआती और विशेषज्ञों के पैनल में थे, शुरुआत के रूप में, आपका संदेश वास्तव में मेरे साथ प्रतिध्वनित हुआ, धन्यवाद!
मैनाकिन

7

मुझे लगता है कि आप जो सबसे अच्छा कर सकते हैं, वह स्क्रिप्ट फ़ाइल और सिस्टम को संरक्षित कर रहा है।

मूल रूप से निम्नलिखित करें:

  • फ़ाइल सिस्टम अनुमतियों का उपयोग करें (chmod 400)
  • सिस्टम पर मालिक के खाते के लिए मजबूत पासवर्ड
  • सिस्टम से समझौता करने की क्षमता कम करें (फ़ायरवॉल, अनावश्यक सेवाओं को निष्क्रिय करें, आदि)
  • उन लोगों के लिए प्रशासनिक / रूट / sudo विशेषाधिकारों को निकालें जिन्हें इसकी आवश्यकता नहीं है

दुर्भाग्य से, यह विंडोज है, मैं इसे एक EXE में लपेटूंगा, और मुझे हर बार पासवर्ड बदलने की आवश्यकता होगी, इसलिए हार्ड-कोडिंग यह एक विकल्प नहीं होगा।
Naftuli Kay

1
विंडोज में अभी भी फाइल सिस्टम अनुमति है। पासवर्ड को किसी बाहरी फ़ाइल में संग्रहीत करें और अपने स्वयं के बाहर सभी की पहुंच को हटा दें। आपको शायद उनके प्रशासनिक विशेषाधिकार भी हटाने होंगे।
कोरी डी

अनुमतियों का उपयोग करके हाँ यहाँ एकमात्र विश्वसनीय सुरक्षा विकल्प है। जाहिर है कि कोई भी प्रशासक डेटा (कम से कम विंडोज़ / सामान्य लिनक्स वितरण पर) का उपयोग करने में सक्षम होगा, लेकिन फिर वह एक लड़ाई पहले ही हार चुका है।
वू

यह सच है। जब पासवर्ड डिक्रिप्शन स्वचालित होता है, तो यह एक सादे टेक्स्ट पासवर्ड के समान ही अच्छा होता है। वास्तविक सुरक्षा पहुंच के साथ उपयोगकर्ता खाते को लॉक करने में है। सबसे अच्छा जो किया जा सकता है वह केवल उस उपयोगकर्ता खाते को रीड-ओनली परमिशन देना है। संभवतः एक विशेष उपयोगकर्ता बनाते हैं, विशेष रूप से और केवल उस सेवा के लिए।
सेपरो

1

ऑपरेटिंग सिस्टम में अक्सर उपयोगकर्ता के लिए डेटा सुरक्षित करने के लिए समर्थन होता है। खिड़कियों के मामले में ऐसा लगता है कि यह http://msdn.microsoft.com/en-us/library/aa380261.aspx है

आप http://vermeulen.ca/python-win32api.html का उपयोग करके अजगर से win32 एपिस को कॉल कर सकते हैं

जहां तक ​​मैं समझता हूं, यह डेटा संग्रहीत करेगा ताकि इसे केवल उस खाते से एक्सेस किया जा सके जो इसे संग्रहीत करने के लिए उपयोग किया गया था। यदि आप डेटा को संपादित करना चाहते हैं, तो आप मूल्य निकालने, बदलने और सहेजने के लिए कोड लिखकर कर सकते हैं।


यह मेरे लिए सबसे अच्छा विकल्प लगता है, लेकिन मुझे लगता है कि यह जवाब इसे स्वीकार करने के लिए बहुत अधूरा है, इसे देखते हुए किसी भी वास्तविक उदाहरण की कमी है।
ArtOfWarfare

1
यहाँ पर अजगर में इन कार्यों का उपयोग करने के लिए कुछ उदाहरण हैं: stackoverflow.com/questions/463832/use-dpapi-with-python
ArtOfWarfare

1

मैंने क्रिप्टोग्राफी का उपयोग किया क्योंकि मुझे अपने सिस्टम पर अन्य सामान्यतः उल्लिखित पुस्तकालयों को स्थापित करने (संकलन करने) में परेशानी हुई। (विन 7 x64, पायथन 3.5)

from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher_suite = Fernet(key)
cipher_text = cipher_suite.encrypt(b"password = scarybunny")
plain_text = cipher_suite.decrypt(cipher_text)

मेरी स्क्रिप्ट शारीरिक रूप से सुरक्षित प्रणाली / कमरे में चल रही है। मैं एक "एन्क्रिप्ट स्क्रिप्ट" के साथ एक फ़ाइल में क्रेडेंशियल्स एन्क्रिप्ट करता हूं। और तब डिक्रिप्ट करें जब मुझे उनका उपयोग करने की आवश्यकता हो। "एनक्रिप्ट स्क्रिप्ट" वास्तविक सिस्टम पर नहीं है, केवल एन्क्रिप्टेड कॉन्फ़िगर फ़ाइल है। कोड का विश्लेषण करने वाला कोई व्यक्ति कोड का विश्लेषण करके आसानी से एन्क्रिप्शन को तोड़ सकता है, लेकिन यदि आवश्यक हो, तो आप अभी भी इसे EXE में संकलित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.