Обучение
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])