Найти - Пользователи
Полная версия: Шифрование пароля в файле конфигурации ini
Начало » Python для новичков » Шифрование пароля в файле конфигурации ini
1 2
VIRTOK
Цель: зашифровать пароль хранящийся в файле конфигурации
пароль должен безопасно хранится в файле config.ini но из файла конфигурации программа должна его подхватывать не в зашифрованном виде

Файл config.ini
 [connect]
login = user
pas = 123456
[FTP]
URL = ftp.ru.debian.org/debian/dists/Debian9.5/

Файл Test.py
 import ConfigINI
config = ConfigINI.loadConfig()
log = config['login']
pas = config['pas']
print(log, pas)



Файл ConfigINI.py
 import os
import configparser
LocalDir = os.getcwd() # Путь к локальной директории
def loadConfig():
    config = configparser.ConfigParser()
    config.read("config.ini")
    #config.read(str(LocalDir+"\\config.ini"))
    login = config.get('connect','login')
    pas = config.get('connect','pas')
    URL = config.get('FTP','URL')
    return {'login':login,'pas':pas,'URL':URL}
    #return {'login':login,'pas':pas}
py.user.next
VIRTOK
пароль должен безопасно хранится в файле config.ini но из файла конфигурации программа должна его подхватывать не в зашифрованном виде
Поставь пакет pycrypto (через pip3 ставится), там есть алгоритм AES для крепкого шифрования. Так шифруешь пароль, потом через модуль base64 кодируешь его в текстовый вид и сохраняешь в ini-файле. Для обратной процедуры читаешь зашифрованный пароль в формате base64, раскодируешь из base64, расшифровываешь из AES. Пароль для AES можешь хранить в программе или брать по сети.
VIRTOK
Если не затруднит прошу привести пример кода
все что я на данный момент сообразил
 import hashlib
h = hashlib.md5(b"password")
p = h.hexdigest()
print(p)
Rodegast
> Пароль для AES можешь хранить в программе или брать по сети.

Вот только такое хранение пароля мало чем отличается от хранения в открытом виде. Нужно пользоваться специализированными службами хранения паролей. https://github.com/jaraco/keyring
VIRTOK
возможно нужно будет зашифровать хранящиеся пароли дргим паролем который не хранить в конфигурационном файле ?
py.user.next
VIRTOK
Если не затруднит прошу привести пример кода
С одной из своих программ взял класс
  
>>> import Crypto.Cipher.AES
>>> import base64
>>> 
>>> class AESCryptor:
...     
...     """Simple encryptor/decryptor in aes-ecb mode"""
...     
...     def __init__(self):
...         pass
...     
...     @staticmethod
...     def _align(b, n):
...         """Align byte sequence by zeros to blocks of some length."""
...         if len(b) == n:
...             return b
...         else:
...             return b + bytes(n - len(b) % n)
...     
...     def encrypt(self, s, p):
...         """Encrypt plain string with password."""
...         bs = s.encode('utf-8')
...         bp = p.encode('utf-8')
...         c = Crypto.Cipher.AES.new(self._align(bp, 16))
...         be = c.encrypt(self._align(bs, 16))
...         e = be.decode('latin1')
...         return e
...     
...     def decrypt(self, s, p):
...         """Decrypt crypted string with password."""
...         bs = s.encode('latin1')
...         bp = p.encode('utf-8')
...         c = Crypto.Cipher.AES.new(self._align(bp, 16))
...         bd = c.decrypt(bs)
...         d = bd.rstrip(b'\x00').decode('utf-8')
...         return d
... 
>>> cryptor = AESCryptor()
>>> cryptor.encrypt('text', 'password')
'èB\x83\x1c\x8a¢¬ÒöeZÏÌr'
>>> cryptor.decrypt('èB\x83\x1c\x8a¢¬ÒöeZÏÌr', 'password')
'text'
>>> 
>>> edata = cryptor.encrypt('text', 'password')
>>> edata
'èB\x83\x1c\x8a¢¬ÒöeZÏÌr'
>>> base64.b64encode(edata.encode('latin1'))
b'6EKDHEisiqKs0vZlWs/Mcg=='
>>> base64.b64decode(b'6EKDHEisiqKs0vZlWs/Mcg==')
b'\xe8B\x83\x1cH\xac\x8a\xa2\xac\xd2\xf6eZ\xcf\xccr'
>>> base64.b64decode(b'6EKDHEisiqKs0vZlWs/Mcg==').decode('latin1')
'èB\x83\x1c\x8a¢¬ÒöeZÏÌr'
>>> cryptor.decrypt('èB\x83\x1c\x8a¢¬ÒöeZÏÌr', 'password')
'text'
>>>


Rodegast
Вот только такое хранение пароля мало чем отличается от хранения в открытом виде.
Кошелёк с паролями в системе тоже легко прослушивается. Можно пароль хранить в конфиге, который закрыт на доступ. Программа может брать пароль из этого конфига через какой-нибудь механизм тонкого доступа к файлу.
VIRTOK
Прошу комментировать строчки , принцип ясен , но есть пробелы
 cryptor.encrypt('text', 'password')
'èB\x83\x1c\x8a¢¬ÒöeZÏÌr'
>>> cryptor.decrypt('èB\x83\x1c\x8a¢¬ÒöeZÏÌr', 'password')
'text'
>>> 
>>> edata = cryptor.encrypt('text', 'password')
>>> edata
'èB\x83\x1c\x8a¢¬ÒöeZÏÌr'
>>> base64.b64encode(edata.encode('latin1'))
b'6EKDHEisiqKs0vZlWs/Mcg=='
>>> base64.b64decode(b'6EKDHEisiqKs0vZlWs/Mcg==')
b'\xe8B\x83\x1cH\xac\x8a\xa2\xac\xd2\xf6eZ\xcf\xccr'
>>> base64.b64decode(b'6EKDHEisiqKs0vZlWs/Mcg==').decode('latin1')
'èB\x83\x1c\x8a¢¬ÒöeZÏÌr'
>>> cryptor.decrypt('èB\x83\x1c\x8a¢¬ÒöeZÏÌr', 'password')
'text'
JOHN_16
VIRTOK
вы так и не поняли… можно как угодно фифровать. Вопрос в том как расшифровать - кто то должен иметь ключ. Либо пользователь, либо программа.
VIRTOK
1.Мне надо защитить информацию от обывателя , что бы поле с паролем в конфиге не читалось
2. Желательно использовать главный пароль который будет расшифровывать остальные, я его буду вводить и тогда пароли из конфигов будут использоваться
3. Прошу привести пример кода если не вас не затруднит
Rodegast
> Кошелёк с паролями в системе тоже легко прослушивается.

Ну это уже от системы зависит.

> Можно пароль хранить в конфиге, который закрыт на доступ. Программа может брать пароль из этого конфига через какой-нибудь механизм тонкого доступа к файлу.

Если злоумышленник получил доступ к конфигу с шифрованными паролями, то скорее всего он получит доступ и к самой программе. А достать от туда пароль или понять от куда он берёться не составляет труда.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB