رمزگذاری عکس های ارسالی از طریقapi

سلام عزیزان امیدوارم عالی باشید
بنده یه برنامه نوشتم که سرور با جنگو هستش و کلاینت با فلاتر api هم با graphql
اطلاعات هم که رد بدل میشه عکس های شخصی هستش که فقط باید خود کاربر ببینه
خود api ها توکن دارن
ولی میخوام بهم یه ایده بدین که بتونم مدیا فایل ها رو رمزگذاری کنم به صورتی که اگه یه نفر به ادرس مدیا فایل هم دسترسی داشته باشه براش باز نشه امیدوارم منظورمو رسونده باشم

یه مثالی مثل دراپ باکس

همچنین برای رمزگذاری متن ها
سپاس

قبل از هرچیزی اینو بگم که بزرگترین مشکل graphql (مثلا درمقایسه با json) بخش authentication و authorization هست. مطمئنید که کسی نمیتونه اطلاعات دیگران رو ریکوئست بزنه؟

برای رمزنگاری شخصی، میتونید از کلید PGP استفاده کنید. لایبرری پایتونش میتونه gpgme باشه و برای فرانت-اند هم میتونید از لایبرری که protonmail برای خودش ساخته (و اوپن‌سورس کرده) استفاده کنید.

کاربر وقتی اکانت میسازه، یه کلید pgp براش ساخته بشه، و هروقت که لاگین میکنه، کلیدش براش فرستاده بشه توی بروزرش. و از اون استفاده کنه برای رمزنگاری چیزهایی که آپلود میکنه و رمزگشایی چیزهایی که دانلود میکنه.

3 پسندیده

سپاس از راهنماییتون
به نظر شما برای چنین کار های کلا از چه زیر ساخت های و الگوریتم های استفاده بشه بهتره

بهتره که فقط و قطعا و اکیدا از چیزی استفاده بشه که یه سری ریاضیدان و رمزنگار ساختنش و به صورت آزاد برای همه در دسترسه و تمام مردم دنیا میدونن چیه و اگه یه مشکلی توش وجود داره، ریپورت میکنن و درست میکنن.
هیچوقت نباید خودمون یه چیزی درست کنیم. قطعا مشکلی توش به وجود میاد.
حالا الگوریتمهایی مثل PGP و RSA (که یه سری محدودیتهای حجمی داره و البته یکی از الگوریتمهایی هست که توی PGP ازش استفاده شده) شاید برای اینکار یه کم زیادی خفن باشن، ولی من ضرری توی استفادشون نمیبینم.
این چیزی که شما طراحی کردید و پیشنهادی که من برای رمزنگاریش دادم هم، چیزیه که خودم خیلیوقته میخواستم درستش کنم ولی هیچوقت نرفتم سمتش.
پس واقعا پیشنهاد بهتر از این ندارم برای این طرح. چیزیه که اگه خودم میخواستم انجامش بدم، اینطوری انجام میدادم و با PGP رمز میکردم.

راستی! درمورد دراپ‌باکس چیزی نمیدونم ولی https://mega.nz مشابه کار شماست و همه‌چیز توی کامپیوتر کاربر رمزنگاری میشه و هیچ کسی حتی با دسترسی فیزیکی به سرورها، امکان مشاهده‌ی فایلها رو نداره.

4 پسندیده

امکانش نیست توی جنگو برای مدیا فایل

login_required

بزاریم مطالعه که من داشتم اینه که باید از nginx کنترل بشه کلا از وب سرویس

درمورد django نمیدونم ولی توی flask میشه یه route براش تعریف کرد که return-type خاص داشته باشه. و چون route داریم، هرکاری میتونیم توش انجام بدیم مثلا چک کردن session یا دریافت json برای چک کردن api-key

@app.route('/hash', methods=['GET', 'POST'])
def hash():
    if request.method == 'POST':
        #check user's credentials
        result = #read-file-from-harddisk as io
        return Response(
            result,
            content_type="video/mp4",
        )
    else:
        return 'hello'

من قبلا از همچین چیزی استفاده میکردم برای جنریت کردن عکس. یوزر که صفحه رو لود میکرد، با Pillow یه عکس میساختم و بعد اون عکس رو میرختم توی BytesIO() و بعد return میکردم با content_type="image/png"

from flask import Flask, request, Response
from io import BytesIO
from PIL import Image, ImageDraw

app = Flask(__name__)

@app.route('/xor', methods=['GET'])
def xor():
    img = Image.new('L', (256,256), 0)

    for x in range(img.size[0]):
        for y in range(img.size[1]):
            img.putpixel((x,y), x^y)

    img = img.resize((img.size[0]*4, img.size[1]*4), resample=Image.NEAREST)
    buffer = BytesIO()
    img.save(buffer, format="PNG")
    output = buffer.getvalue()
    return Response(
        output,
        content_type="image/png",
    )                                                                           

if __name__ == "__main__":
    app.run(debug=True)

این تیکه کد یه عکس میسازه که مقدار هر پیکسلش برابر با xor موقعیت اون پیکسل هست و عکس رو بدون save کردن توی هارد، مستقیم به کاربر نشون میده. (قبل از نشون دادن، resize میکنم که ۴برابر بزرگتر بشه که بهتر دیده بشه)
شما میتونید با همین روش، یه فایل رو از روی هارد بخونید و بریزید توی BytesIO و به کاربر نشونش بدید با response_type مناسب. البته نمیدونم چقدر رم مصرف میکنه! ممکنه خیلی زیاد باشه اگه فایل بزرگ باشه.

1 پسندیده

اینجا ایشون اوکی کردن منم توی جنگو دقیقا همین مراحل رو پیش میرم ولی جواب نمیده کلا اصلا به ویو که نوشتم ریکوست فرستاده نمیشه بازم مستقیم به مدیا فایل میره

از دوستان اگه کسی بتونه راهنمایی کنه ممنون میشم

یه چیزی که ممکنه مشکل ایجاد کرده باشه، نامگذاری rotueها و functionهاست. یه وقتایی یادمه سر یه سری مسائلی با همچین مشکلی مواجه میشدم که یه نامی برای یه تابع یا route میذاشتم که خود فریمورک میخواست از همون استفاده کنه برای فایلهای استاتیک و باعث میشد کد من درست کار نکنه یا اصلا صدا زده نشه (فکر کنم آدرس /static نباید بذارید یا یه همچین چیزی بود)

1 پسندیده

همه حالت ها رو تست کردم ولی پاسخی نگرفتم
نمیشه به nginx گفت هر ادرسی که مربوط به media باشه رو بفرسته به یه ویو خاص جنگو
نمیدونم والا دیگه چکار کنم هیچ ایده ندارم :joy:

Minio

پشتیبانی از رمزنگاری فایل‌ها با استفاده از الگوریتم‌های متنوع از جمله AES-256-GCM، ChaCha20-Poly1305، AES-CBC
پشتیبانی از رمزنگاری با کلید متفاوت به ازای هر فایل و استفاده از Master key برای دسترسی به کلیدها

به نظرم گزینه مناسبی میتونه باشه دوستان تجربیاتتون رو اگه به اشتراک بزارین