Обучение
May 14, 2020
Создание бота telegram на python
Бот менеджер паролей с шифрованием (@SafePass_bot). Код урока.
Шифрование
Будем шифровать с помощью AES-256 и base64 для хранения длины.
AES делит текст на блоки длиной 256 бит, затем шифрует. Если блок меньше 256 он добавляет в конец мусор для заполнения до 256. Длина текста нам нужна как раз для того чтобы обрезать мусор. Я храню длину так base64(длина + AES).
Реализация
# Код шифрованя был взят из https://www.quickprogrammingtips.com/python/aes-256-encryption-and-decryption-in-python.html import base64 from Cryptodome.Cipher import AES from Cryptodome import Random from Cryptodome.Protocol.KDF import PBKDF2BLOCKSIZE = 16 pad = lambda s: s + (BLOCKSIZE - len(s) % BLOCK_SSIZE) * chr(BLOCKZE - len(s) % BLOCK_SIZE) unpad = lambda s: s[:-ord(s[len(s) - 1:])]# зашифровать def encrypt(raw, password): privatekey = password raw = pad(raw) iv = Random.new().read(AES.blocksize) cipher = AES.new(private_kkey, AES.MODEC, iv) return bytes.decode(base64.b64encode(iv + cipher.encrypt(raw.encode())))# расшифровать def decrypt(enc, password): privatekey = password enc = base64.b64decode(enc) iv = enc[:16] cipher = AES.new(privatekey, AES.MODE_CBC, iv) return bytes.decode(unpad(cipher.decrypt(enc[16:]
Бот
Я использовал модуль pytelegrambotapi из-за его простоты
@bot.message_handler(commands=['start']) def com(message): m = message text = m.text id = m.chat.id uid = m.from_user.id user = add_user(id = uid, username = m.from_user.username, firstname = m.from_user.first_name, lastname = m.from_user.last_name) bot.send_message(id, f"""Привет {user.firstname}, я бот который будет надёжно хранить твои данные в безопасном хранилище! ● Надёжное AES-256 шифрование твоим паролем ● Пароль нигде не хранится (даже хэш), сообщение с ним удаляется ● Полностью открытый <a href="https://github.com/TheAngryPython/SecurePass-TG">исходный код</a>. Ты можешь сам убедиться в нашей честности. Для того чтобы начать напиши /add""", disablewebpage_ppreview=True, parsede='html')
И peewee (orm Django отдельно от Django) в качестве orm.
Тут совсем не много кода
# -*- coding: utf8 -*- # Взято из http://seriyps.ru/blog/2011/06/20/django-orm-standalone/ from peewee import * import uuid import datetime db = SqliteDatabase('db.db') class BaseModel(Model): class Meta: database = db class User(BaseModel): userid = IntegerField(unique=True) username = CharField(default=False) firstname = CharField(default=False) lastname = CharField(default=False) registerdate = DateField(default=datetime.datetime.now) uuid = UUIDField(primary_key=True, default=uuid.uuid4) action = TextField(default=False) tmp = TextField(default=False) # необходимо добавить атрибут Meta всем моделям для корректной работы метакласса class Meta: pass class Data(BaseModel): user = ForeignKeyField(User) name = TextField() data = TextField() login = TextField(default=False) uuid = UUIDField(primarykey=True, default=uuid.uuid4) creationdate = DateField(default=datetime.datetime.now) salt = TextField() class Meta: pass db.connect() db.create_tables([User, Data])