Libreng tool para sa privacy

Mag-seal ng file

Mag-encrypt ng file gamit ang isang bagong key na minsan lang ginagamit at ipadala ito sa anumang channel na gusto mo. Sinumang may hawak ng key ay makakabukas nito rito mismo, sa pahinang ito. Walang ina-upload kailanman, walang passphrase na maaaring i-crack, at makikita mo ang laman bago may ma-save.

Ganap na tumatakbo sa tab na ito. Hindi makakakonekta ang pahinang ito sa anumang server.

Malinaw na nakasaad ang bawat parameter

Cipher
AES-256-GCM (WebCrypto), 128-bit tag sa bawat chunk
Key
256 bits mula sa CSPRNG ng browser, bagong ginagawa sa bawat pag-seal, minsan lang ginagamit, walang pinaghahanguan
Paghahati sa mga chunk
isang encrypted na manifest (filename, laki, uri), saka ang file na hinati sa mga chunk na 1 MiB — bawat isa ay hiwalay na ina-authenticate
Nonce
32-bit na random na seal salt ‖ 64-bit na chunk counter — hindi kailanman nauulit sa loob ng isang file, at minsan lang din ginagamit ang key
Authenticated data
ang buong 16-byte header kasama ang index ng bawat chunk at ang kabuuang bilang ng mga chunk — mabibigo ang pag-decrypt kapag binago ang pagkakasunod-sunod, pinutol, o pinagdugtong ang mga chunk
Key string
base64url, 47 character: ang 32-byte key kasama ang isang 3-byte SHA-256 checksum, kaya malinaw na bumabagsak sa pagsusuri ang may typo sa halip na makagawa ng walang saysay na output

Tapat na mga sagot tungkol sa ginagawa nito

Nangyayari ang lahat sa browser mo.

Sa pag-seal at pagbukas, binabasa ang file sa memory ng pahinang ito, pinapatakbo roon ang AES-256-GCM gamit ang built-in na WebCrypto engine ng browser mo, at ibinabalik ang resulta bilang download. Walang ina-upload. Walang account at walang pagproseso sa server. Hindi tulad ng ibang bahagi ng site na ito, hindi man lang nilo-load ng pahinang ito ang counter ng pagbisita na walang cookie. Walang anumang analytics.

Hindi lang ito pangako. Inihahatid ang pahina na may Content-Security-Policy na nagpapahintulot sa browser na kunin lang ang sariling mga static file ng site na ito. Wala itong paraan para ipadala ang file mo, ang key mo, o anupaman sa anumang server, pati sa amin. Buksan ang developer tools ng browser mo habang nagse-seal at wala kang makikitang request. Para sa pinakadirektang patunay, i-install ang Toolbox at mag-seal habang naka-airplane mode. Kapag naka-off ang network, walang makakalabas.

Nakasalalay ang lahat sa key — at hindi namin ito hawak kailanman.

Bawat pag-seal ay gumagawa ng bagong random na 256-bit key sa browser mo. Ipinapakita ito sa iyo nang isang beses at hindi itinatago kahit saan: wala sa mga system namin (walang kasali sa proseso), wala sa storage ng browser mo, wala sa sealed na file. Walang passphrase na huhulaan at walang mabu-brute-force. Sinumang may hawak ng key at ng file ay makakabukas nito. Ang sinumang walang pareho ay hindi makakabukas.

May mabigat itong kahihinatnan: kung mawala ang key, wala na rin ang file. Walang reset, walang support ticket, walang pag-recover. Hindi ito dahil ayaw naming tumulong. Ang kopyang kaya naming i-recover ay kopya ring maaaring nakawin o hingin nang sapilitan ng iba.

Hindi kailanman umaabot sa server ang link ng key.

Inilalagay ng link para sa pagbabahagi ang key pagkatapos ng # sa URL. Nananatili sa browser ang bahaging iyon, na tinatawag na fragment. Hindi ito kailanman kasama sa ipinapadala ng browser sa anumang server, sa amin man o sa iba. Kapag na-load ang pahinang ito na may key sa link, binabasa nito ang key, lumilipat sa tab na Buksan, at agad na inaalis ang key sa address bar. Kaya hindi ito nananatili sa nakikitang URL o sa history ng browser.

Gayunpaman, sinumang may parehong link at sealed na file ay makakabukas nito. Kaya sinasabi ng pahinang ito na ipadala ang file at ang key sa magkaibang channel.

Makikita mo ang laman bago may ma-save.

May dalawang hakbang ang pagbukas. Una, maliit na manifest lang ang dine-decrypt ng pahina: ang orihinal na filename, laki, at uri. Ipinapakita nito iyon sa iyo, kasama ang kapansin-pansing babala para sa mga uri ng file na kayang magpatakbo ng code (mga program, script, installer, dokumentong may macro, HTML) at para sa mga pangalang nagkukunwari gamit ang dobleng extension gaya ng invoice.pdf.exe. Walang isinusulat hangga’t hindi ka nagki-click para mag-decrypt. Hindi kailanman binubuksan o nire-render ng pahina ang mismong na-decrypt na content. Ginagawa lang nitong available ang file para i-download.

Unawain nang malinaw kung ano ang napapatunayan at hindi napapatunayan ng encryption. Kumpidensiyal ang isang sealed na file habang ipinapadala. Walang sinasabi ang pag-seal tungkol sa kung sino ang nagpadala o kung ligtas ang laman nito. Pagdudahan ang hindi inaasahang sealed na file gaya ng pagdududa mo sa hindi inaasahang attachment.

Kung saan talaga ang hangganan ng pagtitiwala.

Nagpapatakbo ka ng code na inihatid sa iyo ng website na ito. Kung makompromiso ang sealby.app o ang koneksiyon mo rito, maaaring basahin ng isang mapaminsalang pahina ang anumang ilagay mo rito. Totoo ito sa bawat web-based na encryption tool, at mas gusto naming sabihin ito kaysa magkunwaring hindi. Ito ang ginagawa namin tungkol dito: isang static file ang pahina, at pinananatili namin itong walang code mula sa ibang partido. Hinahayaan ka ng naka-install na Toolbox na patuloy na gamitin ang bersiyong na-load mo na. At nakadokumento ang format sa ibaba, para makagawa ng mga hiwalay na tool na sumusunod dito.

Kasama rin sa loob ng hangganan ang sarili mong device. Ang mga browser extension na may access sa pahina, o malware sa device, ay makakabasa ng anumang kayang basahin ng alinmang pahina. Itinatago ng sealed na file ang laman nito, pero hindi lahat. Sinumang may hawak nito ay makakakita ng laki nito (halos kasinlaki ng orihinal) at na isa itong file na na-seal ng Sealby.

Mga limitasyon sa simpleng salita

  • Nawalang key = nawalang file. Walang eksepsiyon, sadyang ganito ang disenyo.
  • Hindi namin nakikita ang mga file o key mo, kaya hindi rin namin masusuri ang mga ito para sa malware. Nakabatay lang sa filename ang babala sa uri ng file. Hindi ito garantiya ng kaligtasan.
  • Sinumang may parehong sealed na file at key ay makakabukas nito. Hindi alam o sinusuri ng tool kung sino sila.
  • Ibinubunyag ng laki ng sealed na file ang tinatayang laki ng orihinal na file.
  • Isang file, hanggang 100 MB, sa bawat pag-seal. I-zip muna kung maraming file.

Ang format, bawat byte

Lahat ng kailangan ng isang teknikal na mambabasa upang hiwalay na maberipika ang output ng pahinang ito, o makapagbukas ng .sealed file sa tatlumpung linya ng Python:

bytesfieldcontents
0–7magicASCII "SEALBY-W"
8bersiyon0x01 — anumang iba pa ay tinatanggihan bilang “ginawa gamit ang mas bagong bersiyon”
9algorithm0x01 = AES-256-GCM
10–13seal salt4 bytes, CSPRNG, bago sa bawat pag-seal
14–15nakalaandapat zero
16–endmga chunk framebawat isa: uint32 BE na haba ng ciphertext, saka ang AES-GCM ciphertext + 16-byte tag

Ang chunk 0 ang manifest: UTF-8 JSON {"name":…,"size":…,"type":…}. Ang mga chunk na 1…N−1 ang file na hinati sa mga pirasong 1 MiB. Para sa bawat chunk i mula sa kabuuang N: nonce = salt ‖ uint64 BE i; authenticated data = header ‖ uint64 BE i ‖ uint64 BE N. Kaya nabibigo sa authentication ang pakikialam, pagputol, pagbabago ng pagkakasunod-sunod, paglilipat ng posisyon, at pagdurugtong mula sa magkaibang file. Pinatutunayan ang bawat kaso ng isang naka-commit na negative test.

Key string: base64url (walang padding) ng 32-byte key na sinusundan ng unang 3 bytes ng SHA-256 nito, 47 character sa kabuuan. Hindi pumapasa sa checksum ang typo sa halip na makagawa ng walang saysay na output.

Tool sa pagbukas na sanggunian (Python, cryptography library)
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"])

Para ito sa mga file na ipinapadala. Ang vault ay para sa mga file na nakaimbak.

Pinoprotektahan ng pag-seal ang isang file habang ipinapadala ito kung saanman. Pinoprotektahan ng Sealby ang lahat ng nananatili: mga larawan, file, at note sa mga encrypted na vault sa iPhone mo. Walang account, walang server, at ikaw lang ang makakabasa.

I-download sa App Store

iPhone at iPad · iOS 17+ · Libre