Հակիրճ

Հաշիվը բանալիների զույգ է։ Ո՛չ հեռախոսահամար, ո՛չ փոստ, ո՛չ պարտադիր անուն. հայտնաբերումը լռելյայն անջատված է։ Կապի օպերատորին ուղղված հարցումը ոչինչ չի տալիս. շղթայում օպերատոր չկա։

Երկուղղված gRPC. iOS-ում QUIC-ի վրա՝ HTTP/2-ին անցնելու հնարավորությամբ, Android-ում՝ HTTP/2-ի վրա. մեկ երկարակյաց հոսք, որը դիմանում է ցանցի փոփոխությանը առանց նոր handshake-ի։

Հետքվանտայնությունն արդեն արձանագրության մեջ է։ ML-KEM-1024-ը ինկապսուլացվում է ստացողի Kyber-նախաբանալու մեջ սեսիա հաստատելիս (PQXDH) և մտնում է նրա սկզբնական բանալու մեջ։ Զրույցի առաջին հաղորդագրությունն էլ է պաշտպանված, իսկ առանց հետքվանտային մասի սեսիան ընդհանրապես չի հաստատվում։ Սա պաշտպանում է հաղորդագրություններում և կցորդներում գրվածը։ Թե ով է ուղարկել հաղորդագրությունը, նույնպես թաքնված է հետքվանտային եղանակով, զանգերը՝ երբ երկու հավելվածներն էլ աջակցում են հետքվանտային DTLS։ Առայժմ դասական են՝ սերվերի ստորագրությունները (ուղարկողի վկայագրեր, բանալիների թափանցիկության մատյան), սարքի մուտքը և հաշվի վերականգնումը. խմբեր դեռ չկան. բոլոր շերտերը թվարկված են արձանագրության specification-ում։

Ուղարկողը ծրարում չկա։ Ուղարկողի պաշտպանությունը* անվերապահ է սովորական տրաֆիկի համար։ Առաքման համար սերվերն ունի հաշվի անթափանց նույնացուցիչ**, չափ և ժամանակ։

  • * Ուղարկողի պաշտպանությունը նշանակում է, որ հաղորդագրությունը ճանապարհվում է առանց նշման, թե ով է այն գրել։ Բացահայտել կարող է միայն ստացողը, սերվերը՝ ոչ։ Հավելվածում այն միշտ միացված է (անվտանգության կարգավորումներում՝ «թաքնվածություն»), փոխարկելու բան չկա։
  • ** Անթափանց նույնացուցիչը տող է, որը ձեր մասին ոչինչ չի հաղորդում. նշանների հավաքածու, որը տրվել է հաշիվ ստեղծելիս։

Ինչ կա այսօր

Առայժմ մեսենջերը գոյություն ունի որպես կապի երկրորդ ալիք, որը լրացնում է հիմնականը։ Ֆունկցիոնալը նվազագույն է՝ չաթեր և զանգեր մեկը մեկի հետ։ Խմբեր, ալիքներ և սարքերի միջև համաժամեցում չկան։

Տեխնիկական ճարտարապետություն

Կարճ տարբերակ. հաղորդագրությունները գաղտնագրվում են ձեր սարքում։ Սերվերը տեղափոխում է գաղտնագրված տեքստը՝ առանց այն կարդալու հնարավորության. ստորև բերված են շերտերը, որոնցից դա կազմվում է։

Konstruct-ը կառուցված է Signal Protocol-ի (X3DH + Double Ratchet) հիման վրա, որը զրոյից գրված է Rust-ով և ընդլայնված է բանալիների հետքվանտային համաձայնեցմամբ (ML-KEM-1024)։

Konstruct-ը օգտագործում է gRPC Protocol Buffers-ով արդյունավետ երկուական շրջանակավորման համար և բաց է պահում մշտական երկկողմանի MessageStream իրական ժամանակում առաքման համար՝ առանց request/response polling-ի։ Բեքենդը բաժանված է անկախ ծառայությունների (identity, messaging, signaling, media)՝ խափանումների մեկուսացման համար։ iOS-ում մարտական ուղին gRPC bidi QUIC-ի վրա է՝ HTTP/2-ին ավտոմատ անցումով. Android-ը աշխատում է HTTP/2-ով։

Գաղտնագրության ստեկ

  • X3DH + Double Ratchet (Signal Protocol-ի դիզայն). ծայրից ծայր գաղտնագրում ապագա գաղտնիությամբ (forward secrecy) և post-compromise security-ով (ինքնավերականգնում)։
  • Բանալիների հետքվանտային համաձայնեցում (PQXDH). սեսիայի հաստատման ժամանակ նախաձեռնողը կապսուլացնում է ML-KEM-1024 գաղտնիք (NIST FIPS 203) ստացողի Kyber-նախաբանալու մեջ, և այդ գաղտնիքը մտնում է սեսիայի սկզբնական բանալու մեջ X25519-ի արդյունքների հետ միասին. այսպիսով, գրանցված սեսիան հնարավոր չէ վերականգնել՝ կոտրելով միայն X25519-ը։ Հետքվանտային պաշտպանությունը գործում է հենց առաջին հաղորդագրությունից, և սեսիայի հաստատման դասական ուղի չկա։ Դրանից բացի, յուրաքանչյուր սեսիա վարում է ML-KEM-768 նոսր ռաչետ — թարմ հետքվանտային նյութը խառնվում է զրույցի ընթացքում (ուղղության յուրաքանչյուր 16 փոփոխությունից կամ 7 օրը մեկ), այլ ոչ թե մեկ անգամ՝ հաստատման ժամանակ, և դրանից ածանցվում է յուրաքանչյուր հաղորդագրության սեփական հետքվանտային բանալին։
  • Ստորագրություններ. հիբրիդային Ed25519 + ML-DSA-65 (Dilithium-3, NIST FIPS 204) յուրաքանչյուր հետքվանտային նախաբանալու վրա — ստուգվում են երկուսն էլ. հաճախորդը նախաբանալին չի ընդունի առանց երկու ստորագրությունների։ Հենց հիբրիդային բանալին երաշխավորված է Ed25519 ստորագրությամբ և ամրագրվում է առաջին կոնտակտի ժամանակ։ Սարքի մուտքը, հաշվի վերականգնումը և սերվերի ուղարկողի վկայագրերը առայժմ ստորագրված են միայն Ed25519-ով։
  • AEAD. ChaCha20-Poly1305՝ հաղորդագրությունների գաղտնագրման համար։ KDF. HKDF-SHA256՝ արձանագրության յուրաքանչյուր հատվածի domain-separation պիտակներով։ Anti-spam PoW. Argon2id։
  • Սերվերը չի տեսնում բովանդակությունը. հաղորդագրությունները պահվում են միայն գաղտնագրված տեքստի տեսքով, որը սերվերը չի կարող վերծանել։ Privacy Pass-ի տոկենները կարող են ուղեկցել sealed-ուղարկումներին. տոկենների server-side enforcement-ը դեռ տարածվում է։
  • Գաղտնագրային ճկունություն. արձանագրությունը կրում է ալգորիթմների հավաքածուի տարբերակ, ուստի նոր հավաքածուն կարելի է ներդնել՝ առանց հաղորդագրության ձևաչափը փոխելու։ Վերջին անցումները (PQXDH v2, ռաչետ suite 4) կոշտ էին. հին հավաքածուով սեսիաները մերժվում են և նորից բացվում են հաջորդ ուղարկման ժամանակ։ Քանի դեռ սա ալֆա է, մենք ընտրում ենք այս ճանապարհը, այլ ոչ թե երկարատև համատեղելիությունը։

Տրանսպորտային մակարդակ

  • Երկկողմանի gRPC MessageStream QUIC-ի վրա — մարտական ուղին iOS-ում (construct-transport)։ Մեկ երկարակյաց հոսքը կրում է heartbeat-ներ, մուտքային հաղորդագրություններ և հաստատումներ՝ առանց TCP-handshake-ի յուրաքանչյուր իրադարձության համար, դիմանում է ցանցի փոփոխությանը և ավտոմատ կերպով անցնում է gRPC-ի՝ HTTP/2 + TLS 1.3-ի վրա, երբ QUIC-ը կտրվում է։ Ծայրից ծայր գաղտնագրումը գտնվում է ավելի բարձր. տրանսպորտը տեղափոխում է միայն փակված գաղտնագրված տեքստ, ուստի նրա փոփոխությունը ոչինչ չի փոխում երաշխիքներում։
  • Դիմադրողականություն գրաքննությանը. երբ ուղիղ TLS կապը արգելափակվում է, հաճախորդը անցնում է քողարկման շերտով՝ ավտոմատ կերպով և առանց օգտատիրոջ գործողությունների։ Իրականացումը բաց է, դիզայնը՝ հանրային։ Գործառնական մանրամասները՝ որ տրանսպորտներն են այժմ գործում, ինչ մուտքի կետեր կան և որտեղ են դրանք, չեն հրապարակվում, և ո՛չ հավելվածը, ո՛չ այս կայքը դրանք չեն ցուցադրում։

Ինչ է տեսնում սերվերը

Ցանկացած կենտրոնացված հարթակ ելնում է մեկ ենթադրությունից. «դուք» նրա տվյալների բազայի տողն եք։ Հեռախոսահամար, պրոֆիլ, կոնտակտների գրաֆ, որը պատկանում է նրան և որը նա կարող է փոխանցել։ Konstruct-ը սկսում է ավելի քիչից։ Սերվերը պահում է հաշվի նույնացուցիչը, ձեր բաց բանալիները և push-տոկենը։ Հենց հաղորդագրության մասին նա տեսնում է միայն ստացողի անթափանց id-ն, առաքման ժամանակը և չափը. ուղարկողի պաշտպանությունը հեռացնում է ուղարկողի id-ն, այնպես որ բացահայտել, թե ով է գրել, կարող է միայն ստացողը։ Գաղտնագրված տեքստի երթուղավորման համար հենց այսքանն է պետք։

Առանց հեռախոսագրքի «սառը» հաղորդագրություններ չկան. զրույցը սկսվում է QR կոդից կամ հրավերի հղումից՝ մեկանգամյա և տասներկու ժամ գործող։ Որոնումը օգտանվամբ գոյություն ունի, այն ընտրովի է և անջատված է, քանի դեռ դուք այն չեք միացրել։

Գաղտնագրությունը ձեզ չի դարձնում անտեսանելի։ Ժամանակի և IP-ի կորելյացիան մնում է տեսանելի լարի վրա, և բավականաչափ ռեսուրսներ ունեցող հակառակորդն աշխատում է այդ մակարդակում, այլ ոչ այս։ Այդուհանդերձ, մեր համակարգի ոչ մի բաղադրիչ նախագծված չէ ձեր տվյալները կուտակելու համար։

Ոչ մի հեռաչափություն։ Նույնիսկ «անանձնավորվածը»։

Konstruct-ը չի հավաքում անալիտիկա, օգտագործման մետրիկներ, վարքագծային իրադարձություններ, կրաշների հաշվետվություններ և գովազդային նույնացուցիչներ։ Երրորդ կողմի SDK-եր չկան՝ ո՛չ Firebase, ո՛չ Crashlytics, ո՛չ Sentry. չկան նաև ATT-հարցում և SKAdNetwork։ Թողարկվող կառուցումները ոչ մի լոգ չեն գրում։ Մեկ բան մենք չենք վերահսկում. քանի դեռ բետան աշխատում է TestFlight-ում, Apple-ը մեզ է փոխանցում թեստավորման իր ստանդարտ մետրիկները՝ տեղադրման ամսաթիվը, կառուցման տարբերակը, սեսիաների և կրաշների քանակը։ Սրանք Apple-ի մետրիկներ են, ոչ թե մերը, և դրանք կավարտվեն App Store-ում թողարկմամբ։ Երթուղավորման համար սերվերը պահում է միայն մետատվյալների փոքր ֆիքսված հավաքածու՝ ստացող, ժամանակ, չափ, ձեր բաց բանալիները, iOS-ում՝ push-թոքեն, իսկ ուղարկողի պաշտպանությունը ծրարից հանում է նաև ուղարկողին։ Այն, ինչ սա չի լուծում՝ ժամանակի և IP-ի միջոցով հարաբերակցումը, նկարագրել ենք Գաղտնիության քաղաքականության մեջ։

Հիմնական հնարավորություններ

  • Ծայրից ծայր գաղտնագրում լռելյայն — սերվերները տեսնում են միայն գաղտնագրված տվյալներ։
  • Ապագա գաղտնիություն (forward secrecy) — անցյալ հաղորդագրությունները մնում են պաշտպանված նույնիսկ բանալիների փոխզիջման դեպքում։
  • Ցենզուրայի պաշտպանություն — միացված է լռելյայն։ Քանի դեռ ուղիղ կապն աշխատում է, օգտագործվում է այն. անցումը՝ միայն ապացուցված խափանման դեպքում։
  • Զեն-ինտերֆեյս — ոչ մի ծանուցումների սպամ, ոչ մի սոցիալական աղմուկ, միայն հանգիստ շփում։
  • Բանալիների հետքվանտային համաձայնեցում — ML-KEM-1024 (Kyber-1024) կապսուլացվում է ստացողի Kyber-նախաբանալու մեջ սեսիայի հաստատման ժամանակ (PQXDH) և մտնում է սկզբնական բանալու մեջ. առանց դրա սեսիան չի հաստատվում։ Այնուհետև յուրաքանչյուր սեսիա շարունակում է թարմացնել բանալիները Double Ratchet-ի ներսում՝ ML-KEM-768-ով, և յուրաքանչյուր հաղորդագրություն ունի իր հետքվանտային բանալին։ Ստորագրությունները հիբրիդային են՝ Ed25519 + ML-DSA-65 (Dilithium-3). յուրաքանչյուր հետքվանտային նախաբանալի ստորագրված է երկուսով, և առանց այդ ստորագրությունների նախաբանալիով սեսիա չի հաստատվում։
  • Ժամանակակից live-տրանսպորտ — երկկողմանի gRPC MessageStream QUIC-ի վրա (HTTP/2-ին անցում), արգելափակումների շրջանցում, երբ ուղիղ ճանապարհը փակ է, ուղիղ P2P՝ նախատեսված, երբ երկու զրուցակիցները առցանց են։
  • Բաց կոդ — հաճախորդները, սերվերը և տրանսպորտը՝ սահմանափակ կոպիլեֆտով լիցենզիաների ներքո։ Սեփական սերվերը ճանապարհային քարտեզում է. հավելվածը առայժմ հնարավոր չէ ուղղել դեպի այն։

Նախագծման սկզբունքներ

Երկու դիրքորոշում, որոնցով մենք չենք առևտուր անում.

1. Անվտանգ հետնադռներ գոյություն չունեն։ Գաղտնագրման ցանկացած դիտավորյալ թուլացում բաց է թողնում բացթողում, և դրանով կանցնի ոչ թե նա, ում համար այն թողնվել էր։

2. Գաղտնիություն լռելյայն։ Այն պետք է աշխատի առանց օգտատիրոջ գործողությունների. սա արձանագրության հատկություն է, ոչ թե կարգավորում։

Ինչ չենք անելու։ Ոչ մի հետնադուռ, ինչ պատրվակով էլ որ պահանջեն։ Ներգրավվածության ոչ մի մեխանիկա՝ ո՛չ անվերջ ժապավեն, ո՛չ շարքեր, ո՛չ խայծեր ծանուցումներում։ Տվյալների ոչ մի վերավաճառք. վաճառելու բան չկա, և կերակրելու ենթակա գովազդային բիզնես այստեղ չկա։

Հստակեցում և սկզբնական կոդ

Այս էջում նկարագրված ամեն ինչ մանրամասն քննարկված է արձանագրության հստակեցման մեջ՝ whitepaper-ում։ Այն տարբերակավորվում է կոդի կողքին և պարունակում է միայն այն, ինչը կարելի է ստուգել հղման իրականացմամբ։

NB. արտաքին աուդիտ չի եղել։ Վերևում գրվածը մեր սեփական ընթերցումն է մեր իսկ կոդի։ Նախագծից դուրս որևէ մեկը այն չի ստուգել, և քանի դեռ այդպես է, այդ հատկությունները դիտարկեք որպես այնպիսի հայտարարություններ, որոնք պատրաստ ենք պաշտպանել, այլ ոչ թե որպես ստուգման արդյունքներ։