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