পাইথনে আমাকে নিরাপদে একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড সংরক্ষণ করতে হবে, আমার বিকল্পগুলি কী? [বন্ধ]


95

আমি একটি ছোট পাইথন স্ক্রিপ্ট লিখছি যা পর্যায়ক্রমে তৃতীয় পক্ষের পরিষেবা থেকে ব্যবহারকারীর নাম এবং পাসওয়ার্ড কম্বো ব্যবহার করে তথ্য টানবে। আমার এমন কিছু তৈরি করার দরকার নেই যা 100% বুলেটপ্রুফ (100% এমনকি বিদ্যমান?), তবে আমি সুরক্ষার একটি ভাল পরিমাপ জড়িত করতে চাই তাই খুব কমপক্ষে কারও এটির জন্য এটি দীর্ঘ সময় নিতে পারে।

এই স্ক্রিপ্টটির কোনও জিইউআই থাকবে না এবং এটি পর্যায়ক্রমে চালিত হবে cron, সুতরাং প্রতিবার পাসওয়ার্ড প্রবেশ করানোর সময় জিনিসগুলি ডিক্রিপ্ট করার জন্য চালানো আসলেই কাজ করে না, এবং আমাকে কোনও এনক্রিপ্ট করা ফাইল বা এনক্রিপ্ট করা ব্যবহারকারীর নাম এবং পাসওয়ার্ড সংরক্ষণ করতে হবে একটি SQLite ডাটাবেস, যা বাঞ্ছনীয় হতে হিসাবে আমি SQLite যাহাই হউক না কেন ব্যবহার করছি, এবং আমি করবে পারে সম্পাদনায় যান সময়ে পাসওয়ার্ড প্রয়োজন। তদতিরিক্ত, আমি সম্ভবত পুরো প্রোগ্রামটি একটি এক্সইয়ে আবৃত করব, কারণ এটি এই সময়ে উইন্ডোজের পক্ষে একচেটিয়াভাবে।

আমি কোনও cronকাজের মাধ্যমে পর্যায়ক্রমে ব্যবহার করার জন্য ব্যবহারকারীর নাম এবং পাসওয়ার্ড কম্বো কীভাবে নিরাপদে সংরক্ষণ করতে পারি ?


আরও দেখুন : stackoverflow.com/questions/157938
dreftymac

উত্তর:


19

আমি ssh- এজেন্ট অনুরূপ একটি কৌশল সুপারিশ । আপনি যদি সরাসরি এসএসএল-এজেন্ট ব্যবহার করতে না পারেন তবে আপনি এটির মতো কিছু প্রয়োগ করতে পারেন, যাতে আপনার পাসওয়ার্ডটি কেবল র‍্যামে রাখা হয়। ক্রোন জব প্রত্যেকবার চালিত এজেন্টের কাছ থেকে আসল পাসওয়ার্ড পাওয়ার জন্য শংসাপত্রগুলি কনফিগার করতে পারে, এটি একবার ব্যবহার করতে এবং অবিলম্বে delবিবৃতিটি ব্যবহার করে এটিকে ডি-রেফারেন্স করে ।

প্রশাসককে এখনও বুট-টাইম বা যে কোনও কিছুতে ssh-এজেন্ট শুরু করতে পাসওয়ার্ডটি প্রবেশ করতে হবে, তবে এটি একটি যুক্তিসঙ্গত আপস যা ডিস্কে কোথাও সাদামাটা-পাঠ্য পাসওয়ার্ড সংরক্ষণ করা এড়ানো যায়।


4
+1, এটি অনেক অর্থবোধ করে। আমি সর্বদা এটির জন্য একটি ইউআই তৈরি করতে পারতাম যা মূলত বুটটিতে ব্যবহারকারীকে তার পাসওয়ার্ডের জন্য জিজ্ঞাসা করে, এইভাবে এটি কখনই ডিস্কে সঞ্চিত হয় না এবং চোখের চাকা থেকে নিরাপদ নয়।
নাফটুলি কে

55

পাইথন গ্রন্থাগার keyring সাথে সমন্বয় CryptProtectDataWindows এ এপিআই যা ব্যবহারকারীর লগঅন শংসাপত্রের সঙ্গে ডেটা এনক্রিপ্ট (Mac এবং Linux প্রাসঙ্গিক এপিআই এর সহ)।

সাধারণ ব্যবহার:

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)  

আইটেমগুলি ব্যবহারকারীর অপারেটিং সিস্টেম শংসাপত্রগুলির সাথে এনক্রিপ্ট করা হয়, সুতরাং আপনার ব্যবহারকারী অ্যাকাউন্টে চলমান অন্যান্য অ্যাপ্লিকেশনগুলি পাসওয়ার্ড অ্যাক্সেস করতে সক্ষম হবে।

এই দুর্বলতাটিকে কিছুটা অস্পষ্ট করার জন্য আপনি কীরিং-এ সঞ্চয় করার আগে পাসওয়ার্ডটি কিছু উপায়ে এনক্রিপ্ট / অজানা করতে পারেন। অবশ্যই, যে কেউ আপনার স্ক্রিপ্টকে লক্ষ্যবস্তু করছিল তারা কেবল উত্সটি দেখতে এবং পাসওয়ার্ডটি আন-এনক্রিপ্ট / আনবসফসিয়েট কীভাবে করতে পারে তা বুঝতে সক্ষম হবে, তবে আপনি কমপক্ষে কোনও অ্যাপ্লিকেশনটি ভল্টের সমস্ত পাসওয়ার্ড শূন্য করতে এবং আপনার নিজের পেতেও আটকাতে পারবেন d ।


ব্যবহারকারীর নামটি কীভাবে সংরক্ষণ করা উচিত? না keyringসমর্থন নাম এবং পাসওয়ার্ড উভয় পুনরুদ্ধারের?
স্টিভয়েসিয়াক

4
get_passwordব্যবহারকারীর নামটির জন্য @ ডাস্টিনওয়াইট চালাক ব্যবহার করুন । যদিও, আমি মনে করি আপনার উত্তরটি সহজ keyring.set_password()keyring.get_password()
সরলকরণের

keyringপাইথন স্ট্যান্ডার্ড লাইব্রেরির অংশ নয়
সিয়াসটো পাইকার্জ

@ কায়স্তোপিকারজ উত্তর সম্পর্কে এমন কিছু কি আপনাকে বিশ্বাস করতে পরিচালিত করেছিল যে এটি স্ট্যান্ডার্ড লাইব্রেরির অংশ?
ডাস্টিন ওয়াইয়াট

না keyringলগগুলি এবং মেমরি afterwords থেকে পাসওয়ার্ড মাজা নিরাপদে?
কেবম্যান

26

এটি এবং সম্পর্কিত প্রশ্নের উত্তরগুলি সন্ধান করার পরে, আমি গোপন ডেটা এনক্রিপ্ট এবং অস্পষ্ট করার জন্য প্রস্তাবিত কয়েকটি পদ্ধতি ব্যবহার করে কিছু কোড এক সাথে রেখেছি। এই কোডটি বিশেষত যখন স্ক্রিপ্টটি ব্যবহারকারীর হস্তক্ষেপ ছাড়াই চলতে হয় (যদি ব্যবহারকারী এটি ম্যানুয়ালি শুরু করে থাকে তবে সেগুলি পাসওয়ার্ডে রাখাই ভাল এবং এই প্রশ্নের উত্তরের পরামর্শ অনুসারে কেবল এটিকে স্মৃতিতে রাখা ভাল)। এই পদ্ধতিটি নিরাপদ নয়; মৌলিকভাবে, স্ক্রিপ্টটি গোপন তথ্য অ্যাক্সেস করতে পারে যাতে যার কাছে পুরো সিস্টেম অ্যাক্সেস থাকে তার স্ক্রিপ্ট এবং এর সাথে সম্পর্কিত ফাইল রয়েছে এবং সেগুলি অ্যাক্সেস করতে পারে। এই আইডিটি যা করে তা নৈমিত্তিক পরিদর্শন থেকে ডেটাটিকে অস্পষ্ট করে এবং ডেটা ফাইলগুলিকে স্বতন্ত্রভাবে পৃথকভাবে পরীক্ষা করা হয় বা স্ক্রিপ্ট ছাড়াই পরীক্ষা করে থাকে leaves

এর জন্য আমার প্রেরণা হ'ল এমন একটি প্রকল্প যা আমার কিছু ব্যাংক অ্যাকাউন্টকে লেনদেনের উপর নজর রাখার জন্য পোল করে - আমার প্রতি মিনিট বা দুই মিনিটে পাসওয়ার্ড পুনরায় প্রবেশ না করে পটভূমিতে চালানো দরকার।

আপনার স্ক্রিপ্টের শীর্ষে কেবল এই কোডটি পেস্ট করুন, সল্টসিড পরিবর্তন করুন এবং তারপরে আপনার কোডটিতে স্টোর () পুনরুদ্ধার () এবং () প্রয়োজন হিসাবে ব্যবহার করুন:

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

যদি গোপন ফাইলগুলিতে ওএস অনুমতিগুলি কেবল স্ক্রিপ্টটি তাদের পড়ার অনুমতি দেয় এবং স্ক্রিপ্টটি নিজেই সংকলন করে কেবল এক্সিকিউটেবল হিসাবে চিহ্নিত করা হত (পাঠযোগ্য নয়) তবে এই পদ্ধতির সুরক্ষা উল্লেখযোগ্যভাবে উন্নত হবে। এর কিছু অটোমেটেড হতে পারে তবে আমি মাথা ঘামাইনি। এটির জন্য সম্ভবত স্ক্রিপ্টের জন্য কোনও ব্যবহারকারী সেটআপ করা এবং সেই ব্যবহারকারী হিসাবে স্ক্রিপ্ট চালানো প্রয়োজন (এবং সেই ব্যবহারকারীর কাছে স্ক্রিপ্টের ফাইলগুলির মালিকানা নির্ধারণ)।

আমি যে কোনও পরামর্শ, সমালোচনা বা দুর্বলতার অন্য বিষয়গুলিকে পছন্দ করতে চাই যা যে কেউ ভাবতে পারে। আমি ক্রিপ্টো কোড লিখতে বেশ নতুন তাই আমি যা করেছি তা প্রায় উন্নত হতে পারে।


26

পাইথন প্রোগ্রামটি ব্যবহার করার জন্য পাসওয়ার্ড এবং অন্যান্য গোপনীয়তা সংরক্ষণের জন্য কয়েকটি বিকল্প রয়েছে, বিশেষত এমন একটি প্রোগ্রাম যা ব্যাকগ্রাউন্ডে চালানো দরকার যেখানে এটি কেবল ব্যবহারকারীকে পাসওয়ার্ড টাইপ করতে বলতে পারে না।

সমস্যাগুলি এড়াতে:

  1. উত্স নিয়ন্ত্রণে পাসওয়ার্ডটি পরীক্ষা করা হচ্ছে যেখানে অন্যান্য বিকাশকারীরা এমনকি জনসাধারণ এটি দেখতে পারে।
  2. একই সার্ভারে থাকা অন্য ব্যবহারকারীরা একটি কনফিগারেশন ফাইল বা উত্স কোড থেকে পাসওয়ার্ড পড়ছেন।
  3. এমন একটি উত্স ফাইলে পাসওয়ার্ড থাকা যেখানে আপনি সম্পাদনা করার সময় অন্যরা এটি আপনার কাঁধের উপরে দেখতে পারে।

বিকল্প 1: এসএসএইচ

এটি সর্বদা একটি বিকল্প নয়, তবে এটি সম্ভবত সেরা। আপনার ব্যক্তিগত কী কখনই নেটওয়ার্কের মাধ্যমে প্রেরণ করা হয় না, এসএসএইচ আপনার কাছে সঠিক কী আছে তা প্রমাণ করার জন্য গাণিতিক গণনা চালায়।

এটি কার্যকর করার জন্য আপনার নিম্নলিখিতগুলির প্রয়োজন:

  • আপনি যে ডেটাবেসটি অ্যাক্সেস করছেন তা এসএসএইচ দ্বারা অ্যাক্সেসযোগ্য হওয়া দরকার। "এসএসএইচ" এর সাথে আপনি যে কোনও পরিষেবা অ্যাক্সেস করছেন তা অনুসন্ধান করার চেষ্টা করুন। উদাহরণস্বরূপ, "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)

কীভাবে আপনার অপারেটিং সিস্টেমে পরিবেশের ভেরিয়েবল সেট করবেন এবং তার নিজের অ্যাকাউন্টের অধীনে পরিষেবাটি চালানো বিবেচনা করুন। আপনি যখন নিজের অ্যাকাউন্টে প্রোগ্রাম পরিচালনা করেন তখন পরিবেশের ভেরিয়েবলগুলিতে আপনার সংবেদনশীল ডেটা থাকে না। আপনি যখন এই পরিবেশের ভেরিয়েবলগুলি সেট আপ করেন, তখন অন্যান্য ব্যবহারকারীরা সেগুলি পড়তে না পারে সে জন্য অতিরিক্ত যত্ন নিন। উদাহরণস্বরূপ ফাইল অনুমতি পরীক্ষা করুন। অবশ্যই রুট অনুমতি সহ যে কোনও ব্যবহারকারী সেগুলি পড়তে সক্ষম হবে, তবে এটি সাহায্য করা যায় না। আপনি যদি সিস্টেমড ব্যবহার করছেন তবে পরিষেবা ইউনিটটি দেখুন , এবং কোনও গোপনীয়তার EnvironmentFileপরিবর্তে ব্যবহার করতে সতর্ক হন EnvironmentEnvironmentমানগুলি যে কোনও ব্যবহারকারীর দ্বারা দেখা যেতে পারে systemctl show

বিকল্প 3: কনফিগারেশন ফাইল

এটি পরিবেশের ভেরিয়েবলের সাথে খুব মিল, তবে আপনি কোনও পাঠ্য ফাইল থেকে গোপনীয়তা পড়েন। আমি এখনও ডিভাইসমেন্ট সরঞ্জাম এবং ক্রমাগত ইন্টিগ্রেশন সার্ভারের মতো জিনিসগুলির জন্য পরিবেশের ভেরিয়েবলগুলি আরও নমনীয় পাই। আপনি যদি একটি কনফিগারেশন ফাইল ব্যবহার করতে সিদ্ধান্ত নেন, পাইথন মান লাইব্রেরিতে বিভিন্ন ফরম্যাটের মত সমর্থন তাদেরকে JSON , INI এ , netrc এবং এক্সএমএল । আপনি পাইওয়ামএল এবং টোমেলের মতো বাহ্যিক প্যাকেজগুলিও খুঁজে পেতে পারেন । ব্যক্তিগতভাবে, আমি 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)

এই কৌশলটি ব্যবহার করে এমন একটি প্রকল্প জ্যাঙ্গো । স্পষ্টতই, আপনার settings.pyউত্স নিয়ন্ত্রণের প্রতিশ্রুতি দেওয়া উচিত নয় , যদিও আপনি এমন কোনও ফাইল প্রতিশ্রুতি দিতে চান settings_template.pyযা ব্যবহারকারীরা অনুলিপি এবং সংশোধন করতে পারে।

আমি এই কৌশলটি নিয়ে কয়েকটি সমস্যা দেখছি:

  1. বিকাশকারীরা দুর্ঘটনাক্রমে ফাইলটি উত্স নিয়ন্ত্রণে প্রতিশ্রুতিবদ্ধ হতে পারে। এটি যুক্ত করা .gitignoreসেই ঝুঁকি হ্রাস করে।
  2. আপনার কিছু কোড উত্স নিয়ন্ত্রণে নেই। আপনি যদি শৃঙ্খলাবদ্ধ হন এবং কেবল এখানে স্ট্রিং এবং নম্বর রাখেন তবে সমস্যা হবে না। আপনি যদি এখানে লগিং ফিল্টার ক্লাস লিখতে শুরু করেন, থামুন!

যদি আপনার প্রকল্পটি ইতিমধ্যে এই কৌশলটি ব্যবহার করে, পরিবেশের ভেরিয়েবলগুলিতে স্থানান্তর করা সহজ। সমস্ত সেটিং মানগুলিকে কেবল পরিবেশের ভেরিয়েবলগুলিতে সরিয়ে দিন এবং সেই পরিবেশের ভেরিয়েবলগুলি থেকে পড়ার জন্য পাইথন মডিউলটি পরিবর্তন করুন।


হ্যালো. যদি আপনার প্রকল্পটি ইতিমধ্যে এই কৌশলটি ব্যবহার করে, পরিবেশের ভেরিয়েবলগুলিতে স্থানান্তর করা সহজ। আমি জানিনা কীভাবে উইন্ডোজ 10 এ পরিবেশগত পরিবর্তনশীলগুলি ম্যানুয়ালি সেট করতে হয় তবে এটি ব্যবহার করে আমার অজগর কোড থেকে এগুলি অ্যাক্সেস করতে পারি os.getenv()। কোডটি ভাগ করা থাকলে আমাদের কী করা উচিত? যদি কোডটি অন্য বিকাশকারী দ্বারা ডাউনলোড করা হয়, তবে তার কীভাবে নিশ্চিত হওয়া উচিত যে তার জন্য পরিবেশের ভেরিয়েবলগুলি ইতিমধ্যে সেট করা আছে?
a_sid

আমি os.getenv()@a_sid এর কাছে একটি যুক্তিসঙ্গত ডিফল্ট মানটি পাস করার চেষ্টা করি , তাই কোডটি কমপক্ষে এমন কোনও ব্যবহারকারীর জন্য চালানো হবে যারা পরিবেশের ভেরিয়েবলগুলি সেট করে নি। যদি কোনও ভাল ডিফল্ট মান না থাকে তবে আপনি যখন পাবেন তখন একটি পরিষ্কার ত্রুটি বাড়ান None। তা ছাড়া, সেটিংস ফাইলটিতে পরিষ্কার মন্তব্য করুন। যদি আমি কিছু ভুল বুঝে থাকি তবে আমি আপনাকে আলাদা প্রশ্ন জিজ্ঞাসা করব।
ডন কার্কবি

8

পাসওয়ার্ডটি এনক্রিপ্ট করার চেষ্টা করার খুব একটা পয়েন্ট নেই: আপনি যে ব্যক্তির কাছ থেকে এটি আড়াল করতে চেষ্টা করছেন তার পাইথন স্ক্রিপ্ট রয়েছে, যার কোডটি ডিক্রিপ্ট করার কোড থাকবে। পাসওয়ার্ডটি পাওয়ার দ্রুততম উপায় হ'ল পাইথন স্ক্রিপ্টে তৃতীয় পক্ষের পরিষেবার সাথে পাসওয়ার্ডটি ব্যবহার করার ঠিক আগে একটি মুদ্রণ বিবৃতি যুক্ত করা।

সুতরাং স্ক্রিপ্টে একটি স্ট্রিং হিসাবে পাসওয়ার্ড সংরক্ষণ করুন, এবং বেস 64 এটিকে এনকোড করুন যাতে কেবল ফাইলটি পড়া যথেষ্ট নয়, তারপরে একটি দিন কল করুন।


আমাকে পর্যায়ক্রমে ব্যবহারকারীর নাম এবং পাসওয়ার্ড সম্পাদনা করতে হবে এবং আমি উইন্ডোজের জন্য একটি EXE এ পুরো জিনিসটি মোড়ানো করব; এটি প্রতিফলিত করার জন্য আমি পোস্টটি সম্পাদনা করেছি। আমি যেখানেই এটি সঞ্চয় করে শেষ করি সেখানেই কেবল এটি বেস 64 করা উচিত?
নাফটুলি কে

আমি সম্মত হলাম যে পাসওয়ার্ডটি "এনক্রিপ্ট করা" সাহায্য করে না, যেহেতু প্লেইন-পাঠ্য পাসওয়ার্ড অবশ্যই একটি স্বয়ংক্রিয় ফ্যাশনে পাওয়া উচিত, এবং তাই যা সঞ্চিত তা থেকে অবশ্যই তা গ্রহণযোগ্য হবে। তবে এখানে ব্যবহারযোগ্য পন্থা রয়েছে।
wobi

ভেবেছি আমি আপনার নামটি স্বীকৃত করেছি, আপনি টকপিথনের নতুন এবং বিশেষজ্ঞ প্যানেলে ছিলেন, একজন শিক্ষানবিস হিসাবে, আপনার বার্তাটি সত্যই আমার সাথে অনুরণিত হয়েছে, ধন্যবাদ!
মানাকিন

7

আমি মনে করি যে আপনি যা করতে পারেন তা হ'ল স্ক্রিপ্ট ফাইল এবং সিস্টেমটি চলছে।

মূলত নিম্নলিখিতটি করুন:

  • ফাইল সিস্টেমের অনুমতি ব্যবহার করুন (chmod 400)
  • সিস্টেমে মালিকের অ্যাকাউন্টের জন্য শক্তিশালী পাসওয়ার্ড
  • সিস্টেমের সাথে আপোস করার ক্ষমতা হ্রাস করুন (ফায়ারওয়াল, অবিবাহিত পরিষেবাগুলি অক্ষম করুন ইত্যাদি)
  • যাদের প্রয়োজন নেই তাদের প্রশাসনিক / রুট / সুডোর সুবিধাগুলি সরান

দুর্ভাগ্যক্রমে, এটি উইন্ডোজ, আমি এটি একটি এক্সের সাথে আবৃত করব, এবং আমাকে প্রতিবার প্রায়শই পাসওয়ার্ড পরিবর্তন করতে হবে, তাই হার্ড-কোডিং এটি কোনও বিকল্প হবে না।
নাফটুলি কে

4
উইন্ডোজ এখনও ফাইল সিস্টেম অনুমতি আছে। একটি বাহ্যিক ফাইলে পাসওয়ার্ড সংরক্ষণ করুন এবং আপনার নিজের বাদ দিয়ে সবার অ্যাক্সেস সরান। আপনাকে সম্ভবত তাদের প্রশাসনিক সুবিধাগুলিও সরিয়ে ফেলতে হবে।
কোরি ডি

হ্যাঁ অনুমতি ব্যবহার করা এখানে একমাত্র নির্ভরযোগ্য সুরক্ষা বিকল্প। স্পষ্টতই যে কোনও প্রশাসক এখনও ডেটা অ্যাক্সেস করতে সক্ষম হবেন (কমপক্ষে উইন্ডোজ / সাধারণ লিনাক্স বিতরণে) তবে এটি ইতিমধ্যে হারিয়ে যাওয়া যুদ্ধ।
ভু

এটা সত্যি. যখন পাসওয়ার্ড ডিক্রিপশন স্বয়ংক্রিয় হয়, তখন এটি সরল পাঠ্য পাসওয়ার্ডের মতোই দুর্দান্ত। আসল সুরক্ষাটি অ্যাক্সেস সহ ব্যবহারকারীর অ্যাকাউন্টটি লক করা in সবচেয়ে ভাল যেটি করা যায় তা হ'ল কেবলমাত্র সেই ব্যবহারকারীর অ্যাকাউন্টে কেবল পঠনের অনুমতি দেওয়া। সম্ভবত বিশেষভাবে এবং কেবল সেবার জন্য একটি বিশেষ ব্যবহারকারী তৈরি করুন।
সেপিরো

1

অপারেটিং সিস্টেমগুলি প্রায়শই ব্যবহারকারীর জন্য ডেটা সুরক্ষার জন্য সমর্থন করে। উইন্ডোজের ক্ষেত্রে দেখে মনে হচ্ছে এটি http://msdn.microsoft.com/en-us/library/aa380261.aspx

আপনি http://vermeulen.ca/python-win32api.html ব্যবহার করে পাইথন থেকে win32 এপিস কল করতে পারেন

যতদূর আমি বুঝতে পারি, এটি ডেটা সংরক্ষণ করবে যাতে এটি সঞ্চয় করার জন্য ব্যবহৃত অ্যাকাউন্ট থেকে কেবল এটি অ্যাক্সেস করা যায়। আপনি যদি ডেটাটি সম্পাদনা করতে চান তবে মান বের করতে, পরিবর্তন করতে এবং সংরক্ষণ করতে কোড লিখে আপনি এটি করতে পারেন।


এটি আমার কাছে সেরা পছন্দ বলে মনে হচ্ছে তবে আমি মনে করি এই উত্তরটি গ্রহণ করার পক্ষে এটি একেবারেই অসম্পূর্ণ it's
আর্টঅফ ওয়ারফেয়ার

4
এখানে ওভার পাইথন এসব ফাংশন ব্যবহার করে কিছু উদাহরণ দেওয়া হল: stackoverflow.com/questions/463832/using-dpapi-with-python
ArtOfWarfare

1

আমি ক্রিপ্টোগ্রাফি ব্যবহার করেছি কারণ আমার সিস্টেমে সাধারণত অন্যান্য উল্লিখিত লাইব্রেরি ইনস্টল করতে (সংকলন) করতে আমার সমস্যা হয়েছিল। (উইন 7 এক্স 64, পাইথন 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 এ সংকলন করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.