Güvenlik · Derinlemesine

Uçtan uca kriptografik yaşam döngüsü

Verilerinize her adımda ne olduğunun, temel yapı taşları, parametreler ve güven sınırlarıyla birlikte ayrıntılı bir anlatımı. Her adım sade bir özetle başlar; böylece istediğiniz derinlikte okuyabilirsiniz.

Adım 01 · Şifreleme

Sırrınız cihazınızda mühürlenir

Kısaca: karıştırma işlemi, herhangi bir şey yüklenmeden önce tarayıcınızda yapılır. Bize ulaşan şey zaten okunamaz hâldedir.

Şifrele düğmesine bastığınızda tarayıcı, WebCrypto CSPRNG'den 256 bitlik yeni bir içerik anahtarı alır ve yükünüzü AES-256-GCM ile şifreler. GCM kimlik doğrulamalıdır: her parça 128 bitlik bir etiket taşır; böylece sonradan yapılan her türlü kurcalama, sessizce çözülmek yerine tespit edilir.

Metin ve dosyalar aynı şekilde işlenir: ikisi de tek bir opak ikili veri bloğuna dönüşür ve standart bir boyuta dolgulanır; böylece kısa bir şifre ile küçük bir dosya birbirinden ayırt edilemez. Düz metin ağa hiç dokunmaz ve sekmenin belleğinden hiç çıkmaz.

Şifre algoritmasıAES-256-GCM, 64 KiB parçalar
İçerik anahtarı256 bit, her sır için yeni
Nonce7 baytlık rastgele önek + sayaç
Doğrulama etiketiparça başına 128 bit
DolguPadmé, en az 64 KiB

Adım 02 · Anahtarın saklanması

Anahtar sunucularımızda değil, bağlantıda saklıdır

Kısaca: bağlantının # işaretinden sonraki kısmı anahtarı taşır ve tarayıcılar bu kısmı hiçbir sunucuya göndermez.

Bağlantınız, rastgele 256 bitlik bir tohumu URL parçasında, yani # işaretinden sonraki her şeyde taşır. URL belirtimine göre tarayıcı parçayı ayıklar ve sunucularımıza gönderilen isteğe asla dâhil etmez. Tarayıcı bu tohumdan HKDF ile hem sırrı bulmaya yarayan bir arama değeri hem de içerik anahtarının sarmalamasını açan anahtarı türetir. Sunucu yalnızca arama değerinin bir karmasını görür.

Alıcının tarayıcısı tohumu parçadan okur ve aynı türetmeyi yerelde yapar. Buradaki “sıfır bilgi” ifadesinin anlamı budur: bağlantı olmadan yalnızca şifreli metne sahip olmak hiçbir işe yaramaz.

Anahtarın yeriURL parçası #
Sunucuya gönderilir mi?asla
Tohum32 rastgele bayt, base64url
TüretmeHKDF-SHA-256
Sunucunun sakladığıyalnızca SHA-256(lookup)

Adım 03 · İsteğe bağlı parola

Yalnızca insanların bildiği ikinci bir kilit

Kısaca: bir parola eklerseniz, tam bağlantıya sahip olan biri bile parola olmadan sırrı açamaz.

Bir parola belirlerseniz, parola bellek yoğun bir anahtar türetme fonksiyonu olan Argon2id ile güçlendirilir ve tohumla birleştirilerek içerik anahtarını sarmalayan anahtara dönüştürülür. Parolanın kendisi asla iletilmez veya saklanmaz; onu yalnızca siz ve alıcı bilirsiniz. Yanlış tahminler, alıcının tarayıcısında, zaten elinde olan verilere karşı yeniden denenir; bu yüzden sunucu bunları sayamaz.

Bellek yoğunluğu, büyük ölçekli çevrimdışı tahmin denemelerini GPU'larda ve ASIC'lerde bile pahalı hâle getirir. Parolayı bağlantıdan farklı bir kanaldan paylaşın; böylece iki unsur hiçbir zaman tek bir yerde bir araya gelmez. Argon2 modülü her oluşturma ve göstermede indirilir; böylece ağ, hangi sırların parola kullandığını anlayamaz.

KDFArgon2id
Tuz128 bit rastgele
SarmalamaAES-256-GCM, 96 bitlik IV

Adım 04 · Aktarım & depolama

Cihazınızdan yalnızca şifreli metin çıkar

Kısaca: kilitli bir kutu ve bir son geçerlilik zamanı saklarız. Başka hiçbir şey yok: ne düz metin, ne anahtar, ne de size dair bir kayıt.

Veri bloğu TLS üzerinden yüklenir ve depolamada şifreli metin olarak, karma değeri alınmış kimlik bilgileri, kullanım ömrü ve yuvarlanmış bir son geçerlilik zamanıyla birlikte saklanır. Gönderen kimliği, alıcı, IP kaydı, oluşturma zamanı veya erişim geçmişini bilerek hiç tutmayız. Bir sırrı bir kişiye bağlayacak bir hesap sistemi yoktur. Hız sınırlaması, adresin düzenli olarak değişen bir tuz altında alınmış HMAC'i üzerinden çalışır; böylece bir değişimden öncesi, sonrasıyla ilişkilendirilemez.

Saklanan nesne, parçadaki tohum olmadan anlamsız olduğu için, sunucunun ele geçirilmesi ya da bir mahkeme celbi yalnızca hiçbir şeye geri dönüştürülemeyen opak baytlar ve karmalar ortaya çıkarır.

AktarımdaTLS
Depolamadaşifreli metin + karma anahtarlar + geçerlilik süresi
Kayıtlarsır başına yok

Adım 05 · Alma & imha

İlk okuyan kazanır, ardından sır silinir

Kısaca: tek seferlik bir bağlantıyı açmak kutuyu bir kez teslim eder ve sunucudaki kopyayı siler. Ya da dilediğiniz an kendiniz imha edin.

Gösterme sayfası yüklendiğinde hiçbir şey alınmaz: istek yalnızca gerçek bir tıklama veya tuşa basma ile gönderilir; böylece bağlantı tarama araçları ve sohbet önizlemeleri bir sırrı tüketemez. Tek seferlik bir sır için sunucu, satırı tek bir koşullu güncellemeyle talep eder; yalnızca tek bir istek kazanır ve sır o andan itibaren tüketilmiş sayılır. Bağlantı koparsa aynı tarayıcı 15 dakika boyunca yeniden indirebilir; başka hiç kimse indiremez ve onaylanmamış bir talep geri alınmaz, imha edilir. Süreli sırlar ise süreleri dolana kadar sıradan bir okuma işlemidir.

Her sırrın ayrıca özel bir imha bağlantısı vardır. Bağlantıyı açmak tek başına hiçbir şeyi imha etmez; onayladığınızda şifreli metin, herhangi bir alıcı okuyamadan hemen silinir.

Tek seferlikatomik talep, ardından imha
Yeniden indirme penceresi15 dk, yalnızca aynı istemci
Geçerlilik süresi15 dk – 14 gün
Sahibin kontrolüimha bağlantısı

Tehdit modeli

shhnote neyi görebilir, neyi göremez

Dürüst sürüm. Güven sınırı tam olarak burada.

Cihazınızdan asla çıkmaz

Göremediklerimiz

Düz metniniz · içerik anahtarı ve tohum · parolanız · parola belirlenip belirlenmediği · bir sırrı kimin oluşturduğu veya açtığı · ne zaman oluşturulduğu · IP düzeyinde erişim kayıtları. Bunların hiçbiri iletilmez veya saklanmaz.

Sunucularımızda saklanır

Elimizde olanlar

Açamadığımız şifreli bir veri bloğu · dolgulanmış boyut sınıfı · tarayıcınızın sırrı bulmak veya imha etmek için kullandığı değerlerin tek yönlü karmaları · tek seferlik mi yoksa süreli mi olduğu · yuvarlanmış bir son geçerlilik zamanı. Bağlantınızdaki tohum olmadan hepsi işe yaramaz.

Bilmeye değer

Dürüst çekinceler

Tam bağlantıya (ve belirlendiyse parolaya) sahip olan herkes tek seferlik bir sırrı okuyabilir; bağlantıyı sırrın kendisi gibi görün. Bir sır gösterildikten sonra sayfa, siz ayrılırken üzerine yazabildiğini yazar, ancak JavaScript bunu garanti edemez; işiniz bitince sekmeyi kapatın. Gerçek kullanıcı girdisi enjekte eden otomasyonla yönetilen bir tarayıcı, tek seferlik bir sırrı bir insanın açacağı gibi açabilir; bu durumda alıcı hiçbir şey bulamaz, ki bu da dürüst sonuçtur. Bir sırrı silmek kaydı kaldırır; şifreli kalıntılar üzerine yazılana kadar günlüklerde, boş disk alanında veya yedeklerde, anahtarı olmayan şifreli metin olarak kalabilir. Veritabanının dışında saklanan büyük sırlar, dosyanın yazıldığı zamanı taşır. Ve her web uygulamasında olduğu gibi, tarayıcınıza sunulan koda güvenirsiniz; shhnote'un açık kaynaklı ve kendi sunucunuzda barındırılabilir olmasının nedeni de budur.

Kriptografik belirtim

Tüm yapı taşları tek bir yerde

Şifreleme

AES-256-GCM

64 KiB'lik parçalar hâlinde kimlik doğrulamalı simetrik şifreleme. 256 bitlik bir anahtar ve parça başına bir bütünlük etiketi; böylece kurcalama veya kırpma yalnızca okunamaz hâle gelmekle kalmaz, tespit de edilir.

Anahtar türetme

HKDF · Argon2id

Anahtarlar ve tanımlayıcılar tohumdan HKDF-SHA-256 ile türetilir. İsteğe bağlı parolalar bellek yoğun bir KDF ile güçlendirilir; bu da çevrimdışı kaba kuvvet saldırılarını özel donanımda bile yavaş ve pahalı kılar.

Rastgelelik

WebCrypto CSPRNG

Tohumlar, anahtarlar, tuzlar ve nonce değerleri tarayıcının kriptografik olarak güvenli üretecinden gelir. Asla Math.random() değil, asla tahmin edilebilir değil.

Anahtarın saklanması

URL parçası #

Tohum, bağlantınızdaki # işaretinden sonra yer alır. Tarayıcılar bu parçayı asla iletmez; bu yüzden sunucularımıza hiç ulaşmaz.

Aktarımda

TLS

Cihazınızdan yalnızca şifreli metin çıkar ve modern TLS üzerinden taşınır. Bize ulaşan, açamadığımız opak bir veri bloğudur.

Depolamada

Şifreli metin + karmalar

Şifreli bir veri bloğu, kimlik bilgilerinin tek yönlü karmaları ve yuvarlanmış bir son geçerlilik zamanı saklarız; düz metin yok, anahtar yok, gönderen veya alıcıya dair üst veri yok.

Teknik SSS

Güvenliğe meraklılar için

Tek seferlik garanti, eşzamanlı isteklere karşı nasıl sağlanıyor?

Gösterme işlemi, satırı “active” durumundan “claimed” durumuna taşıyan tek bir koşullu güncelleme çalıştırır. Eşzamanlı iki istek birden başarılı olamaz; ikincisi zaten talep edilmiş bir kayıtla karşılaşır ve herkesle aynı “sır bulunamadı” yanıtını alır. Talep asla geri alınmaz: indirme yarıda kalırsa talep belirtecine sahip olan, süre penceresi içinde yeniden indirir; aksi hâlde sır okunmadan imha edilir.

Neden sorgu parametresi yerine URL parçası?

Sorgu parametreleri sunucuya gönderilir ve erişim kayıtlarına, vekil sunuculara ve analiz araçlarına düşer. Parça (# işaretinden sonrası) ise URL belirtimine göre istemci tarafında kalır; tarayıcı onu HTTP isteğine asla koymaz. Sıfır bilgi tasarımının tüm temeli bu özelliktir. Sır gösterildikten sonra sayfa parçayı adres çubuğundan ve geçmişten de kaldırır.

Bağlantı tarama araçlarının tek seferlik sırları vaktinden önce yakmasını ne engelliyor?

Görüntüleme sayfası her sır için aynı statik belgedir ve yüklenirken hiçbir şey almaz. İstek yalnızca güvenilir bir tıklama veya tuşa basma ile gönderilir; betikle yapılan bir click() ya da form gönderimi sayılmaz. Otomatik tarama araçları (e-posta güvenliği, sohbet önizlemeleri, antivirüs) yalnızca bu statik kabuğu yükler.

Bunu doğrulayabilir veya kendi sunucumda barındırabilir miyim?

Evet. Kaynak kodunun tamamı AGPLv3 lisansıyla herkese açık; protokol, her uygulamanın kendini sınayabileceği uygunluk test vektörleri içeren bir belirtimde yazılı; ayrıca bir kendi sunucunda barındırma rehberi de var. İstemci tarafındaki kriptografiyi denetleyebilir ve kendi kurulumunuzu çalıştırarak güven sınırını tamamen kendi elinizde tutabilirsiniz.

Kötüye kullanımı önlemek için bir şey kaydediliyor mu?

Sır başına erişim kaydı veya IP geçmişi tutmayız. Hız sınırlaması, adresin anahtarlı bir karmasını kullanır; tuz değeri düzenli olarak değişir ve değiştiğinde tüm sayaçları da sıfırlar. Kötüye kullanım bildirimleri günlük olarak sayılır; hangi sırrın bildirildiğine dair kayıt yoktur.

Güvenli paylaşım için ipuçları

  • Parolayı bağlantıdan farklı bir yoldan gönderin; örneğin bağlantıyı e-postayla, parolayı telefonla.
  • İşinizi görecek en kısa geçerlilik süresini seçin.
  • Şifreler ve tam olarak bir kez okunması gereken diğer bilgiler için tek seferlik bir sır kullanın.

Güvenlik açığı bildirme

Bu sitede bir güvenlik sorunu bulduğunuzu düşünüyorsanız, lütfen başka birine söylemeden önce [email protected] adresine e-posta göndererek bize gizlice bildirin. Ne bulduğunuzu ve nasıl yeniden oluşturulabileceğini ekleyin.

Bizim yapacaklarımız:

  • 5 iş günü içinde yanıt vermek;
  • düzeltme sürecinde sizi bilgilendirmek;
  • isterseniz, düzeltmeyi yayımladığımızda adınızı anmak.

Test yaparken lütfen başkalarının verilerine erişmeyin, hizmeti aksatmayın ve hizmete ağır yük bindiren otomatik taramalar çalıştırmayın.

shhnote yazılımının kendisindeki güvenlik açıkları için projenin güvenlik politikasına bakın.

Bir sır oluştur Kaynak kodunu GitHub'da görün

Deneyin, on saniye sürer

Gizli bir şey yazın, tek seferlik bağlantınızı alın ve kayboluşunu izleyin.

Bir sır oluştur