Форум сайта python.su
Цель: зашифровать пароль хранящийся в файле конфигурации
пароль должен безопасно хранится в файле config.ini но из файла конфигурации программа должна его подхватывать не в зашифрованном виде
Файл config.ini
[connect] login = user pas = 123456 [FTP] URL = ftp.ru.debian.org/debian/dists/Debian9.5/
import ConfigINI config = ConfigINI.loadConfig() log = config['login'] pas = config['pas'] print(log, pas)
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}
Отредактировано VIRTOK (Окт. 10, 2018 16:01:58)
Прикреплённый файлы: Crypto_test.zip (831 байт)
Офлайн
VIRTOKПоставь пакет pycrypto (через pip3 ставится), там есть алгоритм AES для крепкого шифрования. Так шифруешь пароль, потом через модуль base64 кодируешь его в текстовый вид и сохраняешь в ini-файле. Для обратной процедуры читаешь зашифрованный пароль в формате base64, раскодируешь из base64, расшифровываешь из AES. Пароль для AES можешь хранить в программе или брать по сети.
пароль должен безопасно хранится в файле config.ini но из файла конфигурации программа должна его подхватывать не в зашифрованном виде
Отредактировано py.user.next (Окт. 10, 2018 16:41:14)
Офлайн
Если не затруднит прошу привести пример кода
все что я на данный момент сообразил
import hashlib h = hashlib.md5(b"password") p = h.hexdigest() print(p)
Отредактировано VIRTOK (Окт. 10, 2018 17:50:29)
Офлайн
> Пароль для AES можешь хранить в программе или брать по сети.
Вот только такое хранение пароля мало чем отличается от хранения в открытом виде. Нужно пользоваться специализированными службами хранения паролей. https://github.com/jaraco/keyring
Офлайн
возможно нужно будет зашифровать хранящиеся пароли дргим паролем который не хранить в конфигурационном файле ?
Офлайн
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\x1cH¬\x8a¢¬ÒöeZÏÌr' >>> cryptor.decrypt('èB\x83\x1cH¬\x8a¢¬ÒöeZÏÌr', 'password') 'text' >>> >>> edata = cryptor.encrypt('text', 'password') >>> edata 'èB\x83\x1cH¬\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\x1cH¬\x8a¢¬ÒöeZÏÌr' >>> cryptor.decrypt('èB\x83\x1cH¬\x8a¢¬ÒöeZÏÌr', 'password') 'text' >>>
RodegastКошелёк с паролями в системе тоже легко прослушивается. Можно пароль хранить в конфиге, который закрыт на доступ. Программа может брать пароль из этого конфига через какой-нибудь механизм тонкого доступа к файлу.
Вот только такое хранение пароля мало чем отличается от хранения в открытом виде.
Отредактировано py.user.next (Окт. 11, 2018 00:24:50)
Офлайн
Прошу комментировать строчки , принцип ясен , но есть пробелы
cryptor.encrypt('text', 'password') 'èB\x83\x1cH¬\x8a¢¬ÒöeZÏÌr' >>> cryptor.decrypt('èB\x83\x1cH¬\x8a¢¬ÒöeZÏÌr', 'password') 'text' >>> >>> edata = cryptor.encrypt('text', 'password') >>> edata 'èB\x83\x1cH¬\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\x1cH¬\x8a¢¬ÒöeZÏÌr' >>> cryptor.decrypt('èB\x83\x1cH¬\x8a¢¬ÒöeZÏÌr', 'password') 'text'
Офлайн
VIRTOK
вы так и не поняли… можно как угодно фифровать. Вопрос в том как расшифровать - кто то должен иметь ключ. Либо пользователь, либо программа.
Офлайн
1.Мне надо защитить информацию от обывателя , что бы поле с паролем в конфиге не читалось
2. Желательно использовать главный пароль который будет расшифровывать остальные, я его буду вводить и тогда пароли из конфигов будут использоваться
3. Прошу привести пример кода если не вас не затруднит
Офлайн
> Кошелёк с паролями в системе тоже легко прослушивается.
Ну это уже от системы зависит.
> Можно пароль хранить в конфиге, который закрыт на доступ. Программа может брать пароль из этого конфига через какой-нибудь механизм тонкого доступа к файлу.
Если злоумышленник получил доступ к конфигу с шифрованными паролями, то скорее всего он получит доступ и к самой программе. А достать от туда пароль или понять от куда он берёться не составляет труда.
Офлайн