უფასო კონფიდენციალურობის ხელსაწყო

ფაილის დალუქვა

დაშიფრეთ ფაილი ახალი ერთჯერადი გასაღებით და გაგზავნეთ ნებისმიერი არხით. გასაღების მფლობელი მას სწორედ აქ, ამ გვერდზე გახსნის. არაფერი იტვირთება, გასატეხი საპაროლო ფრაზა არ არსებობს და შენახვამდე ხედავთ, რა არის შიგნით.

მთლიანად ამ ჩანართში მუშაობს. ამ გვერდს საერთოდ არ შეუძლია რომელიმე სერვერთან დაკავშირება.

ყველა პარამეტრი, სრულად

შიფრი
AES-256-GCM (WebCrypto), თითო ნაწილზე 128-ბიტიანი ტეგი
გასაღები
256 ბიტი ბრაუზერის CSPRNG-დან, ახლად გენერირებული ყოველი დალუქვისთვის, გამოიყენება ერთხელ და არაფრიდან არ წარმოიქმნება
ნაწილებად დაყოფა
დაშიფრული მანიფესტი (ფაილის სახელი, ზომა, ტიპი), შემდეგ კი ფაილი 1 MiB-იან ნაწილებად — თითოეული ცალ-ცალკეა ავთენტიფიცირებული
Nonce
32-ბიტიანი შემთხვევითი seal salt ‖ 64-ბიტიანი ნაწილის მრიცხველი — ფაილში არასოდეს მეორდება, გასაღებიც ერთჯერადია
ავთენტიფიცირებული მონაცემები.
სრული 16-ბაიტიანი სათაური, თითოეული ნაწილის ინდექსი და ნაწილების საერთო რაოდენობა — ნაწილების გადაადგილება, შეკვეცა ან გადაბმა გაშიფვრას არღვევს
გასაღების სტრიქონი
base64url, 47 სიმბოლო: 32-ბაიტიანი გასაღები და 3-ბაიტიანი SHA-256 საკონტროლო ჯამი, რათა ბეჭდვითმა შეცდომამ უაზრო შედეგის ნაცვლად მკაფიო შეცდომა გამოიწვიოს

პატიოსანი პასუხები იმაზე, თუ რას აკეთებს ეს.

ყველაფერი ხდება თქვენს ბრაუზერში.

დალუქვისა და გახსნისას გვერდი ფაილს საკუთარ მეხსიერებაში კითხულობს, ბრაუზერის ჩაშენებული WebCrypto ძრავით AES-256-GCM-ს უშვებს და შედეგს ჩამოსატვირთად გაძლევთ. არაფერი იტვირთება. ანგარიში და სერვერზე დამუშავება არ არსებობს. საიტის სხვა გვერდებისგან განსხვავებით, ეს გვერდი cookie-ს გარეშე ვიზიტების მრიცხველსაც კი არ ტვირთავს. არავითარი ანალიტიკა.

ეს უბრალოდ დაპირება არ არის. გვერდი Content-Security-Policy-ით იტვირთება, რომელიც ბრაუზერს მხოლოდ ამ საიტის სტატიკური ფაილების მიღების უფლებას აძლევს. გვერდს არ შეუძლია თქვენი ფაილის, გასაღების ან სხვა რამის არც ჩვენს და არც სხვა სერვერზე გაგზავნა. დალუქვისას გახსენით ბრაუზერის developer tools და დაინახავთ, რომ არცერთი მოთხოვნა არ იგზავნება. ყველაზე პირდაპირი მტკიცებულებისთვის დააინსტალირეთ Toolbox და დალუქეთ თვითმფრინავის რეჟიმში — გამორთული ქსელით ვერაფერი გავა.

გასაღები ყველაფერია — ჩვენ კი ის არასოდეს გვაქვს.

ყოველი დალუქვისას ბრაუზერში ახალი შემთხვევითი 256-ბიტიანი გასაღები იქმნება. ის მხოლოდ ერთხელ გეჩვენებათ და არსად ინახება: არც ჩვენს სისტემებში (ისინი პროცესში საერთოდ არ მონაწილეობენ), არც ბრაუზერის საცავში და არც დალუქულ ფაილში. გამოსაცნობი საპაროლო ფრაზა და უხეში ძალით გასატეხი არაფერი არსებობს. ვისაც გასაღებიც და ფაილიც აქვს, შეუძლია მისი გახსნა; ვისაც არა — ვერ შეძლებს.

ამას მკაცრი შედეგი აქვს: თუ გასაღები დაიკარგება, ფაილიც დაკარგულია. არ არსებობს განულება, მხარდაჭერის მოთხოვნა ან აღდგენა. ეს ჩვენი გულგრილობა არ არის — ასლი, რომლის აღდგენაც ჩვენ შეგვეძლებოდა, სხვასაც შეეძლებოდა მოეპარა ან მოეთხოვა.

გასაღების ბმული სერვერს არასოდეს აღწევს.

გაზიარების ბმულში გასაღები URL-ის # ნიშნის შემდეგაა. ეს ნაწილი — ფრაგმენტი — ბრაუზერში რჩება და არასოდეს შედის იმ მონაცემებში, რომლებსაც ბრაუზერი ჩვენს ან სხვა სერვერს უგზავნის. როცა გვერდი გასაღებიანი ბმულით იტვირთება, ის გასაღებს კითხულობს, „გახსნის“ ჩანართზე გადადის და მისამართის ზოლიდან გასაღებს დაუყოვნებლივ შლის. ამგვარად ის არც ხილულ URL-ში და არც ბრაუზერის ისტორიაში არ რჩება.

მიუხედავად ამისა, ბმულისა და დალუქული ფაილის მქონე ნებისმიერ ადამიანს შეუძლია მისი გახსნა. ამიტომ გთხოვთ, ფაილი და გასაღები სხვადასხვა არხით გაგზავნოთ.

შენახვამდე ხედავთ, რა არის შიგნით.

გახსნა ორ ეტაპად ხდება. ჯერ გვერდი მხოლოდ მცირე მანიფესტს გაშიფრავს: ფაილის თავდაპირველ სახელს, ზომასა და ტიპს. შემდეგ ამ ინფორმაციას გაჩვენებთ და მკაფიოდ გაფრთხილებთ ფაილის ტიპებზე, რომლებსაც კოდის გაშვება შეუძლია (პროგრამები, სკრიპტები, ინსტალატორები, მაკროიანი დოკუმენტები, HTML), ასევე ორმაგი გაფართოებით შენიღბულ სახელებზე, მაგალითად invoice.pdf.exe. სანამ გაშიფვრას არ დააჭერთ, არაფერი იწერება. გვერდი გაშიფრულ შიგთავსს თავად არასოდეს ხსნის ან გამოსახავს — მხოლოდ ჩამოსატვირთ ფაილს გთავაზობთ.

მკაფიოდ გავმიჯნოთ, რას ამტკიცებს და რას არ ამტკიცებს დაშიფვრა. დალუქული ფაილი გზაში კონფიდენციალურია. დალუქვა არაფერს ამბობს გამომგზავნის ვინაობაზე ან შიგთავსის უსაფრთხოებაზე. მოულოდნელ დალუქულ ფაილს ისეთივე ეჭვით მოეკიდეთ, როგორც მოულოდნელ დანართს.

სად გადის ნდობის რეალური საზღვარი.

თქვენ ამ ვებსაიტის მიერ მოწოდებულ კოდს უშვებთ. თუ sealby.app ან მასთან თქვენი კავშირი გატეხილი აღმოჩნდება, მავნე გვერდს შეუძლია წაიკითხოს ის, რასაც მასში განათავსებთ. ეს ყველა ვებზე დაფუძნებული დაშიფვრის ხელსაწყოს ეხება და გვირჩევნია პირდაპირ ვთქვათ, ვიდრე საპირისპირო მოვაჩვენოთ. ჩვენი ზომები ასეთია: გვერდი სტატიკური ფაილია და მესამე მხარის კოდს არ შეიცავს. დაყენებული Toolbox საშუალებას გაძლევთ უკვე ჩატვირთული ვერსია გამოიყენოთ. ფორმატიც ქვემოთაა დოკუმენტირებული, რათა მასთან თავსებადი დამოუკიდებელი ხელსაწყოები შეიქმნას.

უსაფრთხოების საზღვარში თქვენი მოწყობილობაც შედის. გვერდზე წვდომის მქონე ბრაუზერის გაფართოებებს ან მოწყობილობაზე არსებულ მავნე პროგრამას შეუძლია წაიკითხოს ყველაფერი, რასაც ნებისმიერი გვერდი ხედავს. დალუქული ფაილი შიგთავსს მალავს, მაგრამ არა ყველაფერს: მის მფლობელს შეუძლია დაინახოს ზომა (დაახლოებით ორიგინალის ზომა) და ის, რომ ფაილი Sealby-ითაა დალუქული.

შეზღუდვები მარტივი ენით

  • დაკარგული გასაღები = დაკარგული ფაილი. გამონაკლისი განზრახ არ არსებობს.
  • თქვენს ფაილებსა და გასაღებებს ვერ ვხედავთ, ამიტომ მავნე პროგრამაზეც ვერ ვამოწმებთ. ფაილის ტიპის გაფრთხილება მხოლოდ ფაილის სახელს ეფუძნება და უსაფრთხოების გარანტია არ არის.
  • დალუქული ფაილისა და გასაღების მქონე ნებისმიერ ადამიანს შეუძლია ფაილის გახსნა. ხელსაწყომ არ იცის და არ ამოწმებს, ვინ არის ის.
  • დალუქული ფაილის ზომა დაახლოებით ავლენს თავდაპირველი ფაილის ზომას.
  • თითო დალუქვაზე ერთი ფაილი, მაქსიმუმ 100 MB. რამდენიმე ფაილი ჯერ zip-არქივად შეკარით.

ფორმატი, ბაიტი-ბაიტად

ყველაფერი, რაც ტექნიკურ მკითხველს ამ გვერდის შედეგის დამოუკიდებლად შესამოწმებლად ან .sealed ფაილის Python-ის ოცდაათ სტრიქონში გასახსნელად სჭირდება:

bytesfieldcontents
0–7სიგნატურაASCII "SEALBY-W"
8ვერსია.0x01 — ნებისმიერი სხვა მნიშვნელობა უარყოფილია შეტყობინებით „შექმნილია უფრო ახალი ვერსიით“
9ალგორითმი.0x01 = AES-256-GCM
10–13seal salt4 ბაიტი, CSPRNG, ყოველი დალუქვისთვის ახალი
14–15რეზერვირებულინული უნდა იყოს
16–ბოლომდენაწილების ფრეიმებითითოეული: uint32 BE დაშიფრული ტექსტის სიგრძე, შემდეგ AES-GCM დაშიფრული ტექსტი + 16-ბაიტიანი ტეგი

ნაწილი 0 არის მანიფესტი: UTF-8 JSON {"name":…,"size":…,"type":…}. ნაწილები 1…N−1 შეიცავს ფაილს 1 MiB-იან ნაწილებად. N-დან თითოეული i ნაწილისთვის: nonce = salt ‖ uint64 BE i; ავთენტიფიცირებული მონაცემები = header ‖ uint64 BE i ‖ uint64 BE N. ამიტომ ავთენტიფიკაციას ვერ გაივლის მონაცემების შეცვლა, შეკვეცა, გადაადგილება, თანმიმდევრობის არევა ან სხვადასხვა ფაილის ნაწილების შეერთება. თითოეული შემთხვევა დადასტურებულია რეპოზიტორიაში დაფიქსირებული უარყოფითი ტესტით.

გასაღების სტრიქონი: base64url-ით (შევსების გარეშე) წარმოდგენილი 32-ბაიტიანი გასაღები, რომელსაც მოსდევს პირველი 3 ბაიტი მისი SHA-256 ჰეშიდან — სულ 47 სიმბოლო. ბეჭდვითი შეცდომა უაზრო შედეგის ნაცვლად საკონტროლო ჯამის შემოწმებას ვერ გაივლის.

საცნობარო გამხსნელი (Python, cryptography-ის ბიბლიოთეკა)
import base64, hashlib, json, struct, sys
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SEALBY-W" and raw[8] == 1 and raw[9] == 1
assert raw[14:16] == b"\x00\x00"
header, salt = raw[:16], raw[10:14]
frames, off = [], 16
while off < len(raw):
    (n,) = struct.unpack(">I", raw[off:off + 4]); off += 4
    frames.append(raw[off:off + n]); off += n
assert off == len(raw)

kb = base64.urlsafe_b64decode(sys.argv[2] + "=")   # 47-char key string
key, check = kb[:32], kb[32:35]
assert hashlib.sha256(key).digest()[:3] == check    # typo check

N = len(frames)
def chunk(i):
    nonce = salt + struct.pack(">Q", i)
    aad = header + struct.pack(">QQ", i, N)
    return AESGCM(key).decrypt(nonce, frames[i], aad)

manifest = json.loads(chunk(0))
data = b"".join(chunk(i) for i in range(1, N))
assert len(data) == manifest["size"]
open(manifest["name"], "wb").write(data)
print("decrypted ->", manifest["name"])

ეს გზაში მყოფი ფაილებისთვისაა. სეიფი კი შენახული ფაილებისთვისაა.

დალუქვა ფაილს დანიშნულების ადგილამდე გზაში იცავს. Sealby კი ყველაფერს იცავს, რაც რჩება: ფოტოებს, ფაილებსა და შენიშვნებს თქვენს iPhone-ზე დაშიფრულ სეიფებში. ანგარიში და სერვერები არ არის; წაკითხვა თქვენ გარდა არავის შეუძლია.

ჩამოტვირთეთ App Store-დან

iPhone და iPad · iOS 17+ · უფასო