เครื่องมือความเป็นส่วนตัวฟรี
ผนึกไฟล์
เข้ารหัสไฟล์ด้วยกุญแจใช้ครั้งเดียวที่สร้างขึ้นใหม่ แล้วส่งผ่านช่องทางไหนก็ได้ตามใจ ใครก็ตามที่ถือกุญแจจะเปิดมันได้ตรงนี้ บนหน้านี้เอง ไม่มีอะไรถูกอัปโหลดเลย ไม่มีวลีรหัสผ่านให้แคร็ก และคุณจะเห็นว่าข้างในมีอะไรก่อนที่อะไรจะถูกบันทึก
ทำงานทั้งหมดในแท็บนี้ หน้านี้ไม่สามารถคุยกับเซิร์ฟเวอร์ใดได้เลย
กำลังผนึก…
ผนึกแล้ว
นี่คือไฟล์ที่เข้ารหัสแล้วของคุณ หากไม่มีกุญแจ ไม่มีใครอ่านมันได้ ไม่ใช่เรา ไม่ใช่ใครทั้งนั้น
กุญแจ — แสดงเฉพาะตอนนี้เท่านั้น
กุญแจนี้มีอยู่เฉพาะบนหน้านี้ ณ ตอนนี้เท่านั้น มันไม่ถูกเก็บหรือส่งไปที่ใด ถ้าคุณทำมันหาย ก็ไม่มีใครเปิดไฟล์นั้นได้ รวมถึงเรา บันทึกมันไว้ก่อนออกจากหน้านี้
หรือแชร์กุญแจเป็นลิงก์
กุญแจอยู่หลัง # ในลิงก์ เบราว์เซอร์ไม่เคยส่งส่วนนั้นไปยังเซิร์ฟเวอร์ใด ลิงก์จะเปิดหน้านี้พร้อมแท็บ “เปิด” ที่เตรียมไว้และกุญแจถูกกรอกให้แล้ว จากนั้นจะลบกุญแจออกจากแถบที่อยู่
ส่งไฟล์กับกุญแจแยกกันคนละทาง
ใครก็ตามที่ถือทั้งไฟล์ที่ผนึกแล้วและกุญแจ ย่อมเปิดมันได้ ส่งพวกมันผ่านคนละช่องทาง เช่น ไฟล์ทางอีเมล และลิงก์กุญแจทางข้อความ แล้วจะไม่มีกล่องขาเข้ากล่องใดกล่องเดียวถือทั้งสองอย่าง
อ่านกุญแจจากลิงก์ของคุณแล้ว และลบออกจากแถบที่อยู่ เพื่อไม่ให้มันค้างอยู่ในประวัติของคุณ
กำลังตรวจ…
ข้างในไฟล์ที่ผนึกนี้
ยังไม่มีอะไรถูกบันทึก นี่คือสิ่งที่ไฟล์ที่ผนึกบอกว่ามันบรรจุอยู่:
- ชื่อ
- ขนาด
- ชนิด
ระวัง — ไฟล์ชนิดนี้รันโค้ดบนอุปกรณ์ของคุณได้
ถอดรหัสแล้ว
ไฟล์ถูกถอดรหัสบนอุปกรณ์ของคุณและถูกเสนอให้ดาวน์โหลด ไม่มีอะไรเกี่ยวกับมันออกจากหน้านี้เลย
จากผู้สร้าง Sealby — ตู้นิรภัยเข้ารหัสสำหรับ iPhone
Sealby เก็บรูป ไฟล์ และโน้ตไว้ในตู้นิรภัยเข้ารหัสบน iPhone ของคุณ ไม่มีบัญชี ไม่มีเซิร์ฟเวอร์ ไม่มีใครอ่านได้นอกจากคุณ
ทุกพารามิเตอร์ ระบุไว้ชัด
- ไซเฟอร์
- AES-256-GCM (WebCrypto), แท็ก 128 บิตต่อหนึ่งชิ้น
- กุญแจ
- 256 บิตจาก CSPRNG ของเบราว์เซอร์ สร้างใหม่ทุกครั้งที่ผนึก ใช้ครั้งเดียว ไม่ได้สร้างมาจากอะไรทั้งสิ้น
- การแบ่งชิ้น
- แมนิเฟสต์ที่เข้ารหัส (ชื่อไฟล์ ขนาด ชนิด) แล้วตามด้วยไฟล์ที่แบ่งเป็นชิ้นละ 1 MiB — แต่ละชิ้นถูกยืนยันความถูกต้องแยกกัน
- นอนซ์
- ซอลต์ผนึกสุ่ม 32 บิต ‖ ตัวนับชิ้น 64 บิต — ไม่ซ้ำกันเลยภายในไฟล์เดียว และกุญแจก็ใช้ครั้งเดียวอยู่แล้ว
- ข้อมูลที่ยืนยันความถูกต้อง
- ส่วนหัว 16 ไบต์ทั้งหมด บวกลำดับของแต่ละชิ้นและจำนวนชิ้นทั้งหมด — การสลับลำดับ ตัดท้าย หรือต่อสลับชิ้น ทำให้การถอดรหัสพัง
- สตริงกุญแจ
- base64url 47 อักขระ: กุญแจ 32 ไบต์บวกเช็กซัม SHA-256 ขนาด 3 ไบต์ ตัวพิมพ์ผิดจึงล้มเหลวอย่างสะอาด แทนที่จะให้ข้อมูลขยะออกมา
คำตอบตรงไปตรงมาว่าสิ่งนี้ทำอะไร
ทุกอย่างเกิดขึ้นในเบราว์เซอร์ของคุณ
ทั้งการผนึกและการเปิดต่างอ่านไฟล์เข้าสู่หน่วยความจำของหน้านี้ รัน AES-256-GCM ตรงนั้นด้วยเอนจิน WebCrypto ที่มีมาให้ในเบราว์เซอร์ของคุณ แล้วส่งผลลัพธ์กลับมาเป็นไฟล์ดาวน์โหลด ไม่มีอะไรถูกอัปโหลด ไม่มีบัญชีและไม่มีการประมวลผลฝั่งเซิร์ฟเวอร์ ต่างจากส่วนอื่นของไซต์นี้ หน้านี้ไม่โหลดแม้แต่ตัวนับผู้เข้าชมไร้คุกกี้ ไม่มีระบบวิเคราะห์ชนิดใดเลย
นี่ไม่ใช่แค่คำสัญญา หน้านี้ถูกเสิร์ฟพร้อม Content-Security-Policy ที่อนุญาตให้เบราว์เซอร์ดึงได้เฉพาะไฟล์สแตติกของไซต์นี้เองเท่านั้น มันจึงไม่มีทางส่งไฟล์ กุญแจ หรืออะไรก็ตามของคุณไปยังเซิร์ฟเวอร์ใด รวมถึงของเราด้วย เปิดเครื่องมือนักพัฒนาของเบราว์เซอร์ดูขณะผนึก แล้วคุณจะเห็นคำขอเกิดขึ้นศูนย์รายการ อยากได้ข้อพิสูจน์ที่ตรงที่สุด ติดตั้งกล่องเครื่องมือแล้วผนึกในโหมดเครื่องบิน เมื่อปิดเครือข่ายแล้ว ไม่มีอะไรออกไปได้
กุญแจคือทุกสิ่ง — และเราไม่เคยมีมัน
การผนึกแต่ละครั้งสร้างกุญแจสุ่มใหม่ขนาด 256 บิตในเบราว์เซอร์ของคุณ มันถูกแสดงให้คุณเห็นครั้งเดียวและไม่ถูกเก็บไว้ที่ใดเลย: ไม่อยู่ในระบบของเรา (ไม่มีระบบใดเกี่ยวข้องอยู่แล้ว) ไม่อยู่ในที่จัดเก็บของเบราว์เซอร์ ไม่อยู่ในไฟล์ที่ผนึก ไม่มีวลีรหัสผ่านให้เดา และไม่มีอะไรให้ไล่เดาทุกความเป็นไปได้ ใครถือกุญแจกับไฟล์ก็เปิดได้ ใครไม่ถือก็เปิดไม่ได้
นั่นมีผลตามมาที่หนักแน่น: ถ้ากุญแจหาย ไฟล์ก็หายไป ไม่มีการรีเซ็ต ไม่มีตั๋วซัพพอร์ต ไม่มีการกู้คืน เราไม่ได้กำลังใจร้าย สำเนาที่เรากู้คืนได้ ย่อมเป็นสำเนาที่ใครสักคนขโมยหรือบังคับเรียกเอาไปได้เช่นกัน
ลิงก์กุญแจไม่เคยไปถึงเซิร์ฟเวอร์
ลิงก์แชร์วางกุญแจไว้หลัง # ใน URL ส่วนนั้นที่เรียกว่าแฟรกเมนต์จะถูกเบราว์เซอร์เก็บไว้กับตัว มันไม่เคยรวมอยู่ในสิ่งที่เบราว์เซอร์ส่งไปยังเซิร์ฟเวอร์ใด ไม่ว่าของเราหรือของใคร เมื่อหน้านี้โหลดขึ้นพร้อมกุญแจในลิงก์ มันจะอ่านกุญแจ สลับไปแท็บ “เปิด” แล้วลบกุญแจออกจากแถบที่อยู่ทันที เพื่อไม่ให้มันค้างอยู่ใน URL ที่มองเห็นได้หรือในประวัติเบราว์เซอร์
ถึงอย่างนั้น ใครก็ตามที่มีทั้งลิงก์และไฟล์ที่ผนึกก็เปิดมันได้ นั่นคือเหตุผลที่หน้านี้บอกให้คุณส่งไฟล์กับกุญแจผ่านคนละช่องทาง
คุณเห็นว่าข้างในมีอะไร ก่อนที่อะไรจะถูกบันทึก
การเปิดเกิดขึ้นในสองขั้นตอน ขั้นแรกหน้านี้ถอดรหัสเพียงแมนิเฟสต์ก้อนเล็ก ๆ: ชื่อไฟล์ต้นฉบับ ขนาด และชนิด แล้วแสดงให้คุณดู พร้อมคำเตือนดัง ๆ สำหรับไฟล์ชนิดที่รันโค้ดได้ (โปรแกรม สคริปต์ ตัวติดตั้ง เอกสารที่มีมาโคร HTML) และสำหรับชื่อที่พรางด้วยนามสกุลซ้อนอย่าง invoice.pdf.exe ไม่มีอะไรถูกเขียนลงเครื่องจนกว่าคุณจะคลิกถอดรหัส หน้านี้ไม่เคยเปิดหรือแสดงเนื้อหาที่ถอดรหัสแล้วด้วยตัวเอง มันเพียงเสนอไฟล์นั้นให้ดาวน์โหลด
ขอให้ชัดเจนว่าการเข้ารหัสพิสูจน์อะไรและไม่พิสูจน์อะไร ไฟล์ที่ผนึกเป็นความลับระหว่างเดินทาง การผนึกไม่ได้บอกอะไรเลยว่าใครส่งมา หรือเนื้อหาข้างในปลอดภัยหรือไม่ จงระแวงไฟล์ที่ผนึกซึ่งมาแบบไม่คาดคิด ให้เท่ากับที่คุณระแวงไฟล์แนบที่มาแบบไม่คาดคิด
เส้นแบ่งความไว้วางใจอยู่ตรงไหนกันแน่
คุณกำลังรันโค้ดที่เว็บไซต์นี้ส่งมาให้ ถ้า sealby.app หรือการเชื่อมต่อของคุณไปยังมันถูกเจาะ หน้าที่ประสงค์ร้ายก็อ่านสิ่งที่คุณใส่เข้าไปได้ ข้อนี้จริงกับเครื่องมือเข้ารหัสบนเว็บทุกตัว และเรายอมพูดมันออกมามากกว่าจะแกล้งทำเป็นไม่มี สิ่งที่เราทำเกี่ยวกับเรื่องนี้: หน้านี้เป็นไฟล์สแตติก และเราเก็บมันให้ปลอดโค้ดของบุคคลที่สาม กล่องเครื่องมือที่ติดตั้งไว้ทำให้คุณใช้เวอร์ชันที่โหลดไว้แล้วต่อไปได้ และฟอร์แมตถูกบันทึกไว้ด้านล่าง เครื่องมืออิสระจึงถูกสร้างขึ้นมารองรับมันได้
อุปกรณ์ของคุณเองก็อยู่ในเส้นแบ่งนี้ด้วย ส่วนขยายเบราว์เซอร์ที่มีสิทธิ์เข้าถึงหน้าเว็บ หรือมัลแวร์บนเครื่อง อ่านได้ทุกอย่างที่หน้าเว็บใดก็อ่านได้ ตัวไฟล์ที่ผนึกซ่อนเนื้อหาของมัน แต่ไม่ได้ซ่อนทุกอย่าง ใครถือมันไว้ก็เห็นขนาดของมัน (ราว ๆ ขนาดของต้นฉบับ) และเห็นว่ามันเป็นไฟล์ที่ผนึกโดย Sealby
ขีดจำกัด อธิบายด้วยภาษาง่าย ๆ
- กุญแจหาย = ไฟล์หาย ไม่มีข้อยกเว้น โดยการออกแบบ
- เรามองไม่เห็นไฟล์หรือกุญแจของคุณ เราจึงสแกนหามัลแวร์ในนั้นไม่ได้เช่นกัน คำเตือนเรื่องชนิดไฟล์อ้างอิงจากชื่อไฟล์เท่านั้น ไม่ใช่การรับประกันความปลอดภัย
- ใครก็ตามที่มีทั้งไฟล์ที่ผนึกและกุญแจ เปิดมันได้ เครื่องมือนี้ไม่รู้และไม่ตรวจว่าเขาเป็นใคร
- ขนาดของไฟล์ที่ผนึกเปิดเผยขนาดของไฟล์ต้นฉบับโดยประมาณ
- หนึ่งไฟล์ ไม่เกิน 100 MB ต่อการผนึกหนึ่งครั้ง ถ้ามีหลายไฟล์ให้บีบอัดเป็น zip ก่อน
ฟอร์แมต ทีละไบต์
ทุกสิ่งที่ผู้อ่านสายเทคนิคต้องใช้ในการตรวจสอบผลลัพธ์ของหน้านี้อย่างอิสระ หรือเปิดไฟล์ .sealed ด้วย Python สามสิบบรรทัด:
| bytes | field | contents |
|---|---|---|
| 0–7 | magic | ASCII "SEALBY-W" |
| 8 | version | 0x01 — ค่าอื่นถูกปฏิเสธว่า “สร้างด้วยเวอร์ชันใหม่กว่า” |
| 9 | algorithm | 0x01 = AES-256-GCM |
| 10–13 | ซอลต์สำหรับซีล | 4 ไบต์, CSPRNG, ใหม่ทุกครั้งที่ผนึก |
| 14–15 | reserved | ต้องเป็นศูนย์ |
| 16–จบ | เฟรมของชังก์ | แต่ละเฟรม: ความยาวไซเฟอร์เท็กซ์ uint32 BE แล้วตามด้วยไซเฟอร์เท็กซ์ AES-GCM + แท็ก 16 ไบต์ |
ชิ้นที่ 0 คือแมนิเฟสต์: JSON แบบ UTF-8 {"name":…,"size":…,"type":…} ชิ้นที่ 1…N−1 คือไฟล์ที่แบ่งเป็นท่อนละ 1 MiB สำหรับชิ้นที่ i จากทั้งหมด N ชิ้น: nonce = salt ‖ uint64 BE i; ข้อมูลที่ยืนยันความถูกต้อง = header ‖ uint64 BE i ‖ uint64 BE N ดังนั้นการดัดแปลง การตัดท้าย การสลับลำดับ การย้ายตำแหน่ง และการต่อชิ้นข้ามไฟล์ ล้วนไม่ผ่านการยืนยันความถูกต้อง แต่ละกรณีมีการทดสอบเชิงลบที่คอมมิตไว้เป็นข้อพิสูจน์
สตริงกุญแจ: base64url (ไม่มี padding) ของกุญแจ 32 ไบต์ ตามด้วย 3 ไบต์แรกของ SHA-256 ของมัน รวม 47 อักขระ ตัวพิมพ์ผิดจะไม่ผ่านเช็กซัม แทนที่จะให้ข้อมูลขยะออกมา
ข้อกำหนดฉบับเต็มระดับไบต์ (FORMAT-WEB-v1) ·เวกเตอร์ทดสอบคำตอบที่รู้ล่วงหน้า (JSON)
ตัวเปิดอ้างอิง (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 ของคุณ ไม่มีบัญชี ไม่มีเซิร์ฟเวอร์ ไม่มีใครอ่านได้นอกจากคุณ
iPhone และ iPad · iOS 17+ · ฟรี