برآوردهای فنی

مفاهیم

حساب جمی

  • حساب Jami توسط یک هویت رمزنگاری شده Jami تعریف شده است که بر اساس RSA غیر متقابل کلید-دوگانه و با x.509 گواهینامه به عنوان تعریف شده توسط RFC 5280.

  • جامی از کتابخانه gnutls برای تولید و مدیریت کلید های RSA و گواهینامه ها استفاده می کند.

گواهی جامی

  • اين شناسايي يک کاربر جامي رو نشان ميده

  • تولید شده در زمان ایجاد حساب

  • کليد حساب جامي رو داره

  • اثر انگشت SHA-1 (160 بیت) این گواهینامه عمومی JamiId است.

  • امضا شده توسط یک CA (از یک سازمان یا خود امضا شده).

  • میدان UID موضوع باید شکل ششصدمی JamiId باشد.

  • فیلدی UID صادر کننده باید شکل شش اعشاری از اثر انگشت کلید عمومی صادر کننده باشد.

  • دو کلید تصادفی RSA حداقل 4096 بیت طول می کشد.

گواهی دستگاه

  • اين شناسايي يکي از دستگاه هاي خاصي که براي اداره "جامي" استفاده شده

  • يک نفر به هر دستگاه

  • تصادفي و 4096 بت طول داره

  • اثر انگشت SHA-1 کلید عمومی تبدیل به DeviceId می شود.

  • بايد با کليد خصوصي که گواهينامه جامي رو پيدا کرد امضا بشه

  • میدان UID موضوع باید شکل ششصدمینی دستگاه باشد.

  • فیلدی UID صادر کننده باید شکل شش اعشاری از اثر انگشت کلید عمومی صادر کننده باشد (JamiId).

استفاده

  • "جاميلد"

    • این کلید DHT است که در آن لیست دستگاه های حساب منتشر می شود و در آن همه دستگاه ها به همبستگی در تغییرات حساب گوش می دهند (به عنوان مثال اضافه کردن یا لغو یک دستگاه).

  • کلید های RSA گواهی Jami به عنوان کلید های بلند مدت برای امضا/شفاف/شفاف پیام های ارسال شده از طریق DHT استفاده می شود:

    • کلید خصوصی برای امضا و رمزگذاری پیام های ورودی و گواهینامه های دستگاه.

    • کلید عمومی برای رمزگذاری پیام ها (این توسط فرستنده پیام با استفاده از کلید عمومی گیرنده انجام می شود).

  • یک دستگاه می تواند از حساب Jami با لغو گواهینامه دستگاه "کش" شود:

    • گواهینامه های دستگاه منسوخ شده به یک یا چند لیست منسوخی گواهینامه استاندارد x509 (CRL) اضافه می شوند.

    • CRL برای دستگاه منسوخ شده باید معتبر باشد و با کلید CA مربوطه که کلید خصوصی حساب Jami است، امضا شود.

ذخیره سازی طولانی مدت

  • چرا اطلاعات رو ذخیره ميکني؟

    • جامي هر بار که درخواست شروع ميشه بايد گواهينامه ها و کليد ها رو بار بزنه

    • وقتی جامی یک دستگاه جدید ایجاد می کند، این اطلاعات نیز مورد نیاز است، که از یک دستگاه دیگر با اعتماد به نفس به صورت امن به اشتراک گذاشته می شود.

    • همه سیستم عامل ها راه امن ذخیره سازی داده ها را فراهم نمی کنند، اما Jami از این واقعیت با رمزگذاری داده های ذخیره شده خارج از حافظه (به عنوان مثال در یک سیستم فایل) با استفاده از یک رمز عبور مشخص شده توسط کاربر در هنگام ایجاد حساب پشتیبانی می کند.

  • این فایل ها در دستگاه کاربر ذخیره می شوند (برای جزئیات بیشتر در زیر مشاهده کنید):

    • یک آرکائیو فشرده و رمزگذاری شده با داده های حساب خصوصی.

    • زنجیره گواهینامه های عمومی به عنوان یک فایل CRT

    • کلید خصوصی دستگاه

آرکائیو جمی (export.gz)

  • شامل اطلاعات حساب خصوصی می شود.

  • در حال حاضر در شبکه DHT هنگام ایجاد یا لغو دستگاه منتقل می شود.

  • این یک فایل JSON فشرده و رمزگذاری شده است.

  • فرمت فعلی این است که (می تواند در هر زمان تغییر کند):

{
  ringCaKey: <base64 serialized PEM-encoded CA private key>,
  ringAccountKey: <base64 serialized PEM-encoded Jami private key>
  ringAccountCert: <base64 serialized PEM-encoded Jami certificate (public key)>,
  ethKey: <base64 serialized of the optional 160-bits Etherium key used to register the JamiId on a public blockchain>,
  ringAccountCRL: <base64 serialized of packet list of revoked device certificates PEM-encoded>,
  ringAccountContacts: <JSON dictionary to export trusted user contacts>
}
  • جریان بایت JSON با استفاده از الگوریتم \ * gzip \ * فشرده می شود.

  • سپس جریان gzip با استفاده از رمز AES-GCM-256 با کلید 256 بیت رمزگذاری می شود.

    • این کلید از رمز عبور، رمز PIN و یک مهر زمانی که توسط کاربر ارائه شده است، با استفاده از Argon2 (یک رمز عبور و نرمال کننده) به عنوان زیر حاصل شده است:

salt = PIN + timestamp
key = argon2(password, salt)
  argon2 is the argon2i algorithm using t_cost = 16, m_cost = 2^16 (64 MiB), mono-threaded, to generate a 512-bits key and then hashed with SHA-256 to generate a 256-bits key.
  PIN is a random 32bits number in hexadecimal form.
  + is string concatenation operator.
  timestamp is the current UNIX timestamp divided by 1200 (20 minutes).
  password is a user-chosen password (given at account creation).
  • PIN باید به کاربر نشان داده شود تا به صورت دستی در دستگاه فیزیکی جدید همراه با رمز عبور برای تکمیل فرآیند ایجاد دستگاه کپی شود.

  • توجه: هنگام صادر کردن یک فایل در DHT یا هر جای دیگر، دیمون ابتدا آرشیو را به روز می کند تا آخرین تماس ها را بنویسد. این دلیل است که هنگام صادر کردن رمز عبور مورد نیاز است (این فقط یک کپی از آرشیو در جایی دیگر نیست)

زنجیره گواهینامه دستگاه Jami (ring_device.crt)

  • فرمت PEM

  • شامل گواهی دستگاه و گواهی والدین ( گواهی دستگاه جامع و والدین)

کلید خصوصی دستگاه (ring_device.key)

  • فرمت PEM

  • رمزگذاری نشده، ما اجازه می دهیم سیستم فایل دستگاه محافظت از این فایل

شبکه DHT

صفحه اختصاصی [Jami شبکه توزیع شده] ((Ring_distributed_network "wikilink")

درخواست تماس

  • Deprecated in favor of "Conversation requests"

Conversation request

  • Max 64k (a DHT value)

  • Contains a conversation Id

  • Contains the sender URI

  • Can contains optional metadatas (avatar/profile)

پیام فوری

  • Mostly used to initiate connections with ICE candidates

  • Can transmit some SIP messages, however SIP channel is preferred

  • SIP messages can be read status, location sharing, messages notifications.

تماس های خارج و درآمده

  • آدرس های قابل تماس (یعنی آدرس های IP) کاربر فقط به همتایان داده می شود:

    • چون به همتایان خود دعوت کنیم

    • وقتی یک ** قابل اعتماد ** همسال تماس می گیرد (تصلیحات در حال حاضر).

  • تمام اشکال ترکیبی از نحوه تماس با یک دستگاه خاص با یک پیام ICE خلاصه می شود:

    • *RFC 5245 * ICE (تأسيس ارتباطات تعاملی) را تعریف می کند، پروتکل برای عبور NAT.

    • ICE در جامی برای ایجاد ارتباط بین دو دستگاه استفاده می شود.

تماس با افراد خارج شده

  1. دستگاه تماس کاندیداها را جمع آوری می کند و مطابق با مشخصات ICE ** پیشنهاد اولیه ** را ایجاد می کند.

  2. دستگاه تماس پیشنهاد رمزگذاری شده ICE ( * پیشنهاد اولیه *) را در DHT در: h("[callto:"+DeviceID`](callto:%22+DeviceID)`)` قرار می دهد، جایی که h SHA1 است، + زنجیره ی رشته ای است، DeviceID در شکل ششصدصد است.

  3. دستگاه تماس دهنده منتظر پاسخ همسالان است، با لیست های خود از کاندیداهای ICE.

  4. در ورودی پاسخ همسالان، دستگاه تماس مذاکره ICE را آغاز می کند.

  5. اگر مذاکرات موفق شود، روند در یک جلسه DTLS در طرف مشتری بر روی سوکت ICE ایجاد شده ادامه می یابد (به زیر مراجعه کنید).

گوش دادن به تماس های وارد

  1. یک دستگاه برای تماس های ورودی با انجام عملیات OpenDHT گوش دادن در h("callto:"+DeviceID) جایی که h SHA1 است، + زنجیره ی رشته ای است و DeviceID در شکل شش اعشاری است.

  2. در پذیرش ICE * پیشنهاد اولیه* ، دستگاه ** نامیده شده باید** اعتبار امنیتی همتایی را انجام دهد (به زیر ببینید).

  3. اگه اعتبار امنیتی موفق بشه دستگاه تماس گرفته مذاکره با ICE رو شروع میکنه

  4. اگر مذاکره موفق شود، این فرآیند در یک سیستم DTLS در سمت سرور بر روی سوکت ICE ایجاد شده ادامه می یابد (به زیر مراجعه کنید).

  • Note: OpenDHT drops values that are not properly encrypted or signed, as specified by OpenDHT protocol.

فرمت سریالیزاسیون ICE

  • پیام های ICE که در طول تماس بین همسالان به اشتراک گذاشته می شوند، از فرمت زیر استفاده می شوند.

  • یک پیام ICE یک قطعه داده های دوگانه است که در قالب داده های [msgpack] (http://msgpack.org/) است.

<8-bits unsigned integer> giving the version of ICE message format protocol used for the rest of the data,
<C++ std::pair of string> of the ICE local session ufrag and the ICE local session password,
<8-bits unsigned integer> giving the number of components in the ICE session,
<array of string> of the previous number entries, where each string describe the ICE candidate, formated as an "a=" line (without the "a=" header) described in [rfc5245, section 4.3](https://tools.ietf.org/html/rfc5245#page-26)
  • ** پروتکل فعلی تعریف شده 1** است:

تایید امنیت همسال

  • پس از دریافت پیشنهاد ICE اولیه رمزگذاری شده و امضا شده (بر طریق عملیات گوش دادن) ، دستگاه تماس گرفته باید چک مجوز دستگاه تماس را انجام دهد که به عنوان امضا کننده پیشنهاد اولیه شناخته می شود.

  • قوانین مجاز سازی اجرای تعریف شده است، اما اجرای معمول اجازه تماس های شناخته شده یا قابل اعتماد را می دهد.

  • اگر دستگاه تماس مجاز نباشد یا اگر به دلایل مشخصی برای اجرای، دستگاه تماس گرفته درخواست اتصال درآمده را رد کند، دستگاه تماس گرفته باید پیشنهاد اولیه را نادیده بگیرد و ممکن است رویداد را ثبت کند.

  • اگر دستگاه تماس گرفته اجازه دهنده تماس گرفته و می خواهد اتصال را قبول کند باید پاسخ ICE را ایجاد کند، روند مذاکره ICE را آغاز کند و پاسخ ICE رمزگذاری شده و امضا شده را در همان کلید DHT ارسال کند.

مذاکره در مورد DTLS

  • هنگامی که یک کانال ارتباطی همتایی با همتایی توسط پروتکل ICE ایجاد شده است، دستگاه تماس گرفته شده یک جلسه DTLS در سمت سرور در سوکت ICE را شروع می کند، در حالی که تماس گیرنده یک جلسه DTLS در سمت مشتری را در سمت دیگر سوکت ICE شروع می کند.

  • ارتباطات DTLS RFC6347 با استفاده از کتابخانه gnutls سازگار است.

  • برای جلوگیری از نمایش گواهینامه های همتایان در متن ساده برای نامزدی تماس، دست دادن جلسه دو بار انجام می شود:

  1. اولین دست دادن در حالت نامناسب برای ایجاد یک حمل و نقل امن اما نامناسب.

  2. دست دادن دوم در حالت ** گواهی**، در مقابل اولین، برای اثبات هویت همسالان.

  • فقط سوئیتهای رمزگذاری PFS پشتیبانی می شوند:

    • مجموعه ی سوئیت های رمزگذاری پشتیبانی شده، پیاده سازی تعریف شده است اما باید حداقل شامل ECDHE-AES-GCM باشد.

    • سوئت های رمزگذاری واقعی (در شکل گندل) عبارتند از:

      • مرحله ناشناس: SECURE192:-KX-ALL:+ANON-ECDH:+ANON-DH:+SECURE192:-VERS-TLS-ALL:+VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION

      • مرحله گواهینامه: SECURE192:-VERS-TLS-ALL: +VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION

سیگنالینگ SIP

  • استفاده شده در جلسه DTLS برای سیگنال دادن تماس (vcard، مذاکره رسانه ای، تماس، پیام فوری،...)

  • هنگامی که یک کانال ارتباطی همتایان رمزگذاری شده و معتبر در دسترس است، باید از [پروتوکول SIP] (https://tools.ietf.org/html/rfc3261) برای قرار دادن تماس و ارسال پیام استفاده شود.

  • تماس گیرنده ممکن است بلافاصله بعد از ایجاد کانال DTLS یک SIP INVITE ارسال کند.

  • اجرای SIP باید از ICE و SRTP حمایت کند.

  • کدک های پشتیبانی شده پیاده سازی تعریف شده است، اما مشتریان Jami باید کد صوتی Opus و کد ویدئویی H264 را پشتیبانی کنند.

  • SRTP باید هنگام مذاکره رسانه ای با SIP، با استفاده از یک کلید تصادفی جدید برای هر رسانه و هر مذاکره استفاده شود. ICE باید هنگام مذاکره رسانه ای با SIP استفاده شود.

حضور

  • Sent on the DHT

  • DeviceAnnouncement (contains device hash + public key)

امنیت / حریم خصوصی

جامی برای تماس ها و در پیام های متنی تماس با مذاکره کلید های مختلف Eliptic Curve Diffie-Hellman در هر تماس را فراهم می کند. برای پیام رسانی خارج از تماس RSA-4096 واحد استفاده می شود. کتابخانه رمزنگاری استفاده شده GNUTLS است

اطلاعات بیشتر:

  • [تعمیرات فنی](تعمیرات فنی/تعمیرات فنی) مفاهیم و پروتکل های داخل Jami