Alat privasi percuma

Meteraikan fail

Sulitkan fail di bawah kunci sekali guna yang baharu dan hantarkannya melalui apa jua saluran yang anda suka. Sesiapa yang memegang kunci itu membukanya terus di sini, pada halaman ini. Tiada apa-apa pernah dimuat naik, tiada frasa laluan untuk dipecahkan, dan anda melihat apa yang ada di dalamnya sebelum apa-apa disimpan.

Berjalan sepenuhnya dalam tab ini. Halaman ini tidak boleh berhubung dengan mana-mana pelayan langsung.

Setiap parameter, dinyatakan

Sifer
AES-256-GCM (WebCrypto), tag 128-bit bagi setiap keping
Kunci
256 bit daripada CSPRNG pelayar, dijana baharu bagi setiap meterai, digunakan sekali, tidak diterbitkan daripada apa-apa
Pengepingan
satu manifes yang disulitkan (nama fail, saiz, jenis), kemudian fail itu dalam keping 1 MiB — setiap satu disahkan berasingan
Nonce
garam meterai rawak 32-bit ‖ pembilang keping 64-bit — tidak pernah berulang dalam satu fail, dan kuncinya pula sekali guna
Data disahkan
pengepala penuh 16 bait ditambah indeks setiap keping dan jumlah bilangan keping — menyusun semula, memotong atau menyambung keping akan merosakkan nyahsulitan
Rentetan kunci
base64url, 47 aksara: kunci 32 bait ditambah checksum SHA-256 3 bait, supaya kesilapan taip gagal dengan bersih dan bukannya menghasilkan sampah

Jawapan jujur tentang apa yang alat ini lakukan

Semuanya berlaku dalam pelayar anda.

Pemeteraian dan pembukaan kedua-duanya membaca fail ke dalam memori halaman ini, menjalankan AES-256-GCM di situ dengan enjin WebCrypto terbina dalam pelayar anda, dan memulangkan hasilnya sebagai muat turun. Tiada apa-apa dimuat naik. Tiada akaun dan tiada pemprosesan di pelayan. Tidak seperti seluruh laman ini, halaman ini tidak memuatkan pembilang lawatan tanpa kuki pun. Tiada analitik dalam apa jua bentuk.

Ini bukan sekadar janji. Halaman ini disajikan dengan Content-Security-Policy yang membenarkan pelayar mengambil hanya fail statik laman ini sendiri. Ia tiada cara untuk menghantar fail anda, kunci anda, atau apa-apa lain ke mana-mana pelayan, termasuk kami. Buka alat pembangun pelayar anda semasa memeteraikan dan anda akan lihat sifar permintaan. Untuk bukti paling terus terang, pasang Kotak Alat dan meteraikan dalam mod pesawat. Dengan rangkaian dimatikan, tiada apa-apa boleh keluar.

Kunci itu segala-galanya — dan kami tidak pernah memilikinya.

Setiap meterai menjana kunci rawak 256-bit yang baharu dalam pelayar anda. Ia ditunjukkan kepada anda sekali dan tidak disimpan di mana-mana: tidak dalam sistem kami (tiada satu pun terlibat), tidak dalam storan pelayar anda, tidak dalam fail termeterai itu. Tiada frasa laluan untuk diteka dan tiada apa-apa yang boleh dipecahkan secara paksa. Sesiapa yang memegang kunci dan fail boleh membukanya. Sesiapa yang tidak, tidak boleh.

Itu ada akibat yang tegas: jika kunci hilang, fail itu hilang. Tiada tetapan semula, tiada tiket sokongan, tiada pemulihan. Ini bukan kerana kami tidak mahu membantu. Salinan yang kami boleh pulihkan ialah salinan yang seseorang boleh curi atau tuntut.

Pautan kunci tidak pernah sampai ke pelayan.

Pautan kongsi meletakkan kunci selepas # dalam URL. Bahagian itu, iaitu fragmen, kekal dalam pelayar. Ia tidak pernah dimasukkan dalam apa yang dihantar pelayar ke mana-mana pelayan, kami atau sesiapa pun. Apabila halaman ini dimuatkan dengan kunci dalam pautan, ia membaca kunci itu, bertukar ke tab Buka, dan segera membuang kunci daripada bar alamat. Jadi ia tidak berlegar dalam URL yang kelihatan atau dalam sejarah pelayar.

Namun begitu, sesiapa yang mempunyai kedua-dua pautan dan fail termeterai boleh membukanya. Itulah sebabnya halaman ini memberitahu anda supaya menghantar fail dan kunci melalui saluran yang berbeza.

Anda melihat isi kandungannya sebelum apa-apa disimpan.

Membuka berlaku dalam dua langkah. Mula-mula halaman itu menyahsulit hanya manifes kecil: nama fail asal, saiz dan jenis. Ia menunjukkannya kepada anda, dengan amaran lantang bagi jenis fail yang boleh menjalankan kod (program, skrip, pemasang, dokumen makro, HTML) dan bagi nama yang disamarkan dengan sambungan berganda seperti invoice.pdf.exe. Tiada apa-apa ditulis sehingga anda mengklik untuk menyahsulit. Halaman ini tidak pernah membuka atau memaparkan kandungan yang dinyahsulit itu sendiri. Ia hanya menawarkan fail untuk dimuat turun.

Fahami dengan jelas apa yang penyulitan buktikan dan tidak buktikan. Fail termeterai adalah rahsia semasa dalam perjalanan. Pemeteraian tidak mengatakan apa-apa tentang siapa yang menghantarnya atau sama ada kandungannya selamat. Layan fail termeterai yang tidak dijangka dengan syak yang sama seperti lampiran yang tidak dijangka.

Di mana sempadan kepercayaan sebenarnya berada.

Anda menjalankan kod yang laman web ini sajikan kepada anda. Jika sealby.app atau sambungan anda kepadanya dikompromi, halaman yang berniat jahat boleh membaca apa yang anda masukkan ke dalamnya. Ini benar bagi setiap alat penyulitan berasaskan web, dan kami lebih rela menyatakannya daripada berpura-pura sebaliknya. Apa yang kami lakukan tentangnya: halaman ini fail statik, dan kami menjaganya bebas daripada kod pihak ketiga. Kotak Alat yang dipasang membolehkan anda terus menggunakan versi yang sudah anda muatkan. Dan formatnya didokumenkan di bawah, supaya alat bebas boleh dibina terhadapnya.

Peranti anda sendiri juga berada di dalam sempadan itu. Sambungan pelayar dengan akses halaman, atau perisian hasad pada mesin, boleh membaca apa sahaja yang mana-mana halaman boleh baca. Fail termeterai itu menyembunyikan kandungannya, tetapi bukan segala-galanya. Sesiapa yang memegangnya boleh melihat saiznya (lebih kurang saiz asalnya) dan bahawa ia fail termeterai Sealby.

Had dalam bahasa mudah

  • Kunci hilang = fail hilang. Tiada pengecualian, secara reka bentuk.
  • Kami tidak boleh melihat fail atau kunci anda, jadi kami juga tidak boleh mengimbasnya untuk perisian hasad. Amaran jenis fail itu berdasarkan nama fail sahaja. Ia bukan jaminan keselamatan.
  • Sesiapa yang mempunyai kedua-dua fail termeterai dan kunci boleh membukanya. Alat ini tidak tahu atau menyemak siapa mereka.
  • Saiz fail termeterai lebih kurang mendedahkan saiz fail asal.
  • Satu fail, sehingga 100 MB, setiap meterai. Zipkan berbilang fail dahulu.

Format itu, bait demi bait

Semua yang diperlukan pembaca teknikal untuk mengesahkan output halaman ini secara bebas, atau membuka fail .sealed dalam tiga puluh baris Python:

bytesfieldcontents
0–7magicASCII "SEALBY-W"
8versi0x01 — apa-apa selain itu ditolak sebagai “dibuat dengan versi lebih baharu”
9algoritma0x01 = AES-256-GCM
10–13garam meterai4 bait, CSPRNG, baharu bagi setiap meterai
14–15dikhaskanmesti sifar
16–akhirbingkai kepingsetiap satu: panjang teks sifer uint32 BE, kemudian teks sifer AES-GCM + tag 16 bait

Keping 0 ialah manifes: JSON UTF-8 {"name":…,"size":…,"type":…}. Keping 1…N−1 ialah fail dalam cebisan 1 MiB. Bagi keping i daripada N: nonce = garam ‖ uint64 BE i; data disahkan = pengepala ‖ uint64 BE i ‖ uint64 BE N. Jadi pengusikan, pemotongan, penyusunan semula, pemindahan dan penyambungan silang fail semuanya gagal pengesahan. Setiap kes dibuktikan oleh ujian negatif yang dikomit.

Rentetan kunci: base64url (tanpa pad) bagi kunci 32 bait diikuti 3 bait pertama SHA-256-nya, 47 aksara kesemuanya. Kesilapan taip gagal checksum dan bukannya menghasilkan sampah.

Pembuka rujukan (Python, pustaka 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"])

Ini untuk fail dalam perjalanan. Peti besi untuk fail yang menetap.

Pemeteraian melindungi fail dalam perjalanannya ke suatu tempat. Sealby melindungi segala yang menetap: foto, fail dan nota dalam peti besi disulitkan pada iPhone anda. Tanpa akaun, tanpa pelayan, tidak boleh dibaca oleh sesiapa kecuali anda.

Muat turun di App Store

iPhone & iPad · iOS 17+ · Percuma