Home אבטחת מידעInformation Security הסבר על תקשורת מאובטחת SSL \ TLS הצפנה\הצפנות RSA ומנגנון החלפת מפתחות Diffie Hellman

הסבר על תקשורת מאובטחת SSL \ TLS הצפנה\הצפנות RSA ומנגנון החלפת מפתחות Diffie Hellman

by Tal Ben Shushan 03/06/2018 1 comment
הסבר על תקשורת מאובטחת SSL \ TLS הצפנה\הצפנות RSA ומנגנון החלפת מפתחות Diffie Hellman
נהנתם מהמאמר ? שתפו אותו!

כל הזכויות שמורות לטל בן שושן – Shushan.co.il

תקשורת מאובטחת ומנגנון החלפת מפתחות Diffie Hellman


מאמרים קשורים:

הסבר על תקשורת מאובטחת SSL \ TLS הצפנה RSA ומנגנון החלפת מפתחות Diffie Hellman
הסבר על תעודות אבטחה SSL Certificate
הסבר על Public Key Infrastructure
יצירת תעודת אבטחה דיגטלית והתקנת התעודה ב Apache
Certificate Authority, Enterprise,Standalone והסבר על תעודות
מאמרים ישנים יותר
הסבר על תעודות אבטחה ויצירתם דרך Linux


כאשר אנחנו מתחברים לאתר מאובטח ב HTTPS אנחנו בעצם יודעים שהתקשורת מאובטחת, אבל כיצד זה בדיוק מתבצע?

במאמרים נוספים באתר המסבירים על נושא המפתחות הבנו כי ה Public Key הוא למעשה ציבורי וכולם יכולים לראות אותו, אבל עניין חשוב מאוד הוא שכאשר ה Public Key יצפין מידע מסוים, יהיה ניתן לפתוח אותו רק על ידי ה Private Key אשר יושב בשרת.

כאשר המשתמש נכנס לאתר הדבר הראשון שקורה הוא Hello:

 – Handshake Hello

המשתמש מתחיל תהליך של “לחיצת ידיים” Handshake, המשתמש שולח לשרת ClientHello ובו את המידע על איזה גרסה של SSL יכול המשתמש לתמוך ופרמטרים נוספים.
לאחר מכן השרת שולח ServerHello ובו ההגדרות של איזה TLS הם ישתמשו בינהם ואיזה cipher suite (לדוגמה AES והם ישתמשו במנגנון על מנת להחליף את המפתחות האלו וליצור אותם והשימוש הוא על ידי Diffie Hellman)

Certificate Exchange

כאשר התקשורת התחילה, השרת חייב להוכיח למשתמש שהוא האתר שהוא מציג עצמו, האתר מציג למשתמש את תעודת האבטחה שלו ובה כל הפרטים המזהים: הכתובת האתר, המנפיק, ה Public Key וכו’
המשתמש בודק את התעודה אל מול הTrusted Root Certificate Authority ואם הכל תקין הם יתחילו את החלפת המפתחות.

Key Exchange – החלפת מפתחות

בשלב ה Hello השרת והלקוח מחליטים על צורת ההצפנה סימטרית ואסימטרית, מדוע על ידי שניהם?
הלקוח משתמש ב Public Key של השרת על מנת להצפין “מפתח” סימטרי – זוג מפתחות שגם מצפינות וגם פותחות את ההצפנה
הלקוח שולח את אחד המפתחות לשרת על ידי כך שהוא הצפין אותו על ידי ה Public Key של השרת, השרת פותח את ההצפנה שיש על המפתח על ידי ה Private Key שלו

מאותו הרגע יש תקשורת מאובטחת בין הלקוח לשרת שכן לשרת יש את המפתח שגם פותח וגם מצפין וגם ללקוח יש את אותו המפתח שגם מצפין וגם פותח את אותה ההצפנה.

עד כה הסברתי את זה בצורה הפשוטה ביותר, כעת נעבור לצורה קצת יותר טכנית

 

TLS \ SSL

SSL ו TLS הם פרוטקולי אבטחה, SSL הוא קיצור של Secure Socket Layer והוא נוצר במקור על ידי חברת הדפדפנים האגדית Netscape לאחריו הגיע SSLv2 ואז SSLv3 (שניהם מעולם לא פורסמו) ואחרי SSLv3 השם שונה לTLS שאתם שומעים כל הזמן TLS הוא קיצור של  Transport Layer Security,  וכך הגיע TLS 1.0 ואחריו TLS 2.0 (שדילגו עליו) ואחריו TLS 3 (שהוכרז עם בעיות אבטחה ובוטל)

הTLS השולט היום הוא TLS 1.2, אז אך התהליך עובד? אך השרת מחליט באיזה צורה לעבוד? אך נוצרת תקשורת מאובטחת בין הלקוח לשרת?

עד כה למדנו שהלקוח משתמש ב Public Key של השרת ומצפין את ההודעות ולאחר מכן השרת פותח את ההודעה עם ה Private Key שלו

מהרגע שבו הלקוח מצפין את ההודעה לא ניתן לפתוח את ההצפנה ורק המפתח הפרטי של השרת יכול לפתוח אותו ולכן –

ההצפנה היא חד כיוונית

נתחיל מהבסיס,

Session Keys

הן מפתחות שמצפינות את המידע בצורתSymmetric Encryption אחרי שהשתמשנו ב Asymmetric Encryption

להרחבת הידע על מנת להבין מאמר זה יש לקרוא באתר את המאמר הסבר על Public Key Infrastructure

Ciphers – “ערבוב טקסט”

Cipher הוא צופן, הוא אלגוריתם שמטרתו להצפין את “המידע” (רצף של ביטים) ולמנוע את ההבנה שלהם ללא “הקוד המקורי של הצופן”
בהסבר פשוט

נאמר ויש טבלה כזו

א – ט

ב – ן

ג – ב

ד – ש

ה -ל

ו – ש

ז – ו

אם אני ארצה לכתוב טל בן שושן אוכל לכתוב

אה גב וזוב – ללא הטבלה המקורית לא תוכלו להבין מה כתוב פה – כמובן שההסבר שלי מופשט ככל הניתן, המטרה של

ברמה הטכנית קיימים 2 סוגים של Cipher

Substitution Cipher Vs Transposition cipher

Substitution Cipher שידוע גם בכינוי “צופן סיזר” והיא החלפת אותיות – אחת השיטות היא ROT13 קיצור של Rotation 13

יש 26 תויים באלפא-בית האנגלי (לטיני) לכן אם נספור מA עד האות M נספור 13 תווים

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

למה הוספתי עוד פעם את ה ABC זאת על מנת שנוכל לחשב בקלות את ה Cipher ניקח את הדוגמה המוכרת ביותר

HELLO

אם נרצה לבצע את זה Rotation 13 נספור מH כמות הפעמים שה Rotation שזה 13 פעמים נגיע ל T ואחרי T קיימת האות U (סופרים 13 פעמים והאות אחרי היא האות ב Cipher)
כך למעשה HELLO = URYYB

Transposition cipher

צורה זו באה לידי ביטוי על ידי העמודות שבה ההודעה נכתבת ולפי כמות העמודות.
על מנת להבין זאת נציג את זה כך:

ניקח את ההודעה “פגוש אותי במרכז העיר מחר בערב”

ניקח למשל 6 שורות

פ-ג-ו-ש-א-ו

ת-י-ב-מ-ר-כ

ז-ה-ע-י-ר-מ

ח-ר-ב-ע-ר-ב

אם נרצה לבצע Transposition cipher ניקח כל עמודה ונכתוב אותה

פ-ת-ז-ח ג-י-ה-ר ו-ב-ע-ב ש-מ-י-ע א-ר-ר-ר ו-כ-מ-ב

בגלל שאנחנו יודעים שזה 6 שורות נוכל לבצע חזרה על הטבלה ובכך לגלות את הטקסט.

ה Cipher שנמצא בשימוש הרחב ביותר הוא AES קיצור של Advanced Encryption Standrad
(DES נחשב ללא בטוח ולכן לא מומלץ לשימוש)

AES משתמש במפתח או בשמו העיקרי Master Key מפתח מאסטר, אשר פותח את המידע המוצפן או מצפין אותו.

Block And Stream Cipher

שניהם הם Symmetric Encryption:

Block Cipher – מצפין “בלוקים” מתוך המידע הנשלח, לא משנה מה אורך המידע, הוא יפרק את המידע לחלקים וכל חלק הוא יצפין , דוגמה לזה הוא AES ומוצג ב 128Bit או 256Bit והוא מצפין את הבלוקים באורך של 128Bit או 256Bit

Steam Cipher – מצפין בחלקים קטנים או יותר נכון Bit אחר Bit, דוגמה להצפנה בצורה הזו היא להצפין שיחות \ ווידאו על מנת להצפין את המידע ב Live

TLS \ SSL תרשים זרימה

כאשר אנחנו מדברים על הצפנות, עלינו להבין את הבסיס ובשביל זה הכנתי תרשים זרימה:

תחילה הלקוח חייב ליזום תקשורת TCP ולהתחיל את TCP Handshake, תחילת השיחה היא על מנת למצוא Cipher (צורת הצפנה) – ושבו צורת ההצפנה יוצרת (Shared Key) מפתח משותף (זהה, אותו מפתח) בו שני הצדדים יוכלו לתקשר באופן מאובטח

השיטה הזו נוצרה על מנת ליצור מצב בו הצדדים לא משתמשים בהצפנה אסימטרית כל הזמן , כיוון ששיטה זו מאטה את השיחה ולא כל כך מאובטחת (אסביר בהמשך)

בתוך השיחה המוצפנת נמצא ה SSL_SESSION ובתוכו נמצא ה Shared Key

על השיחה להתנהל בתוך ה Https בשיחה על מנת שהמשתמש יאמת את האתר אל מול גורם שאימת את האתר והתעודה שלו, שכן המפתח הפרטי נמצא אצל השרת בלבד ולא אצל “הגורם המנפיק” של התעודה.

לאחר הTCP HandShake ובו ה TLS \ SSL הלקוח שולח לשרת הודעה ובה הוא “מבקש להתחיל שיחה מאובטחת”
הלקוח חייב לשלוח לשרת – “רשימת ה Ciphers בו הוא תומך”

הוא שולח רשימת Cipher במקרה שלנו הוא AES (אופציה הגיונית נוספת היא 3DES) רשימת הCipher לרוב כוללת את שני אלו בלבד

יכולים להיות עוד Ciphers כדוגמת:

RC4 קיצור של Rivest’s Cipher

IDEA – היה אמור להחליף את 3Des ויותר בשימוש של PGP

Blowfish היה אמור להחליף את DES אבל בסוף מי שהחליף את שתיהם הוא AES

הוא שולח לו הודעת  ClientHello.cipher_suites

השרת מקבל את הרשימה בה הלקוח תומך (מה הדפדפן תומך)

ואז שולח אליו חזרה באיזה Cipher הוא רוצה להשתמש (AES) ואת המפתח הציבורי שלו (בטעות בתמונה רשום Private Key)

המשתמש מוודא את התעודה של השרת (בעזרת חתימה דיגיטלית שנמצאת בתעודה ומוודא שאכן השרת שלח לו את ה Public Key)

ECDHE-ECDSA-AES256

מאותו הרגע מתחילם לעבוד, המנגנון להחלפת מפתחות, המנגנון המפורסם ביותר הוא Diffe Hellman בצורת Elliptic-curve

והמפתח הציבורי והפרטי בשיטת RSA

לכן כאשר אתם מתחברים לשרת אתם מקבלים את ההודעה הבאה

ECDHE-ECDSA-AES256 כל אלו מוסברים במאמר זה.

המשך

הלקוח מייצר מפתח מאסטר  (Master Key)  ומשתמש ב Public Key על מנת להצפין את המפתח מאסטר שהרגע יצר.

הוא שולח אותו אל השרת (מוצפן כמובן)

השרת משתמש במפתח הפרטי שלו על מנת לפתוח את ההודעה בה נמצא ה מפתח מאסטר.

השרת והלקוח משתמשים במפתח מאסטר על לחשב את ה “מפתח\קוד משותף”

הלקוח משתמש “במפתח המשותף” שהוא ה Shared Key ואיתו מצפין הודעה, שולח את ההודעה לשרת ומבקש ממנו לפתוח את ההצפנה שכן מעכשיו הם משתמשים רק ב Shared Key (הצפנה סימטרית)

כעת השרת פותח את ההודעה על ידי ה”מפתח המשותף” שהוא ה Shared Key ואם הצליח, שולח הודעה שגם היא מוצפנת על ידי הה”מפתח המשותף” שהוא ה Shared Key ואומר ללקוח ב Shared Key הזה נשתמש במהלך השיחה

כעת הלקוח והשרת שולחים הודעות מוצפנות על ידי ה Shared Key (קוד\מפתח משותף) לכל אורך השיחה

אז מהו מנגנון להחלפת מפתחות?

השימוש הנפוץ ביותר הוא ב Diffie Hellman, על מנת לגלות אם אכן השרת משתמש בDiffie Hellman יש ללחוץ על F12 בכרום ואז Security TAB

ניתן לראות שבאמצע כתוב ECDHE_RSA הפירוש של זה Elliptic-curve Diffie–Hellman המשולב עם מנגנון ה RSA וזה אומר מנגנון אנונימי להחלפת מפתחות בין השרת לבין הלקוח והם משתפים בינהם Secret Key בדיוק כמו בהצפנה סימטרית, כך שמפתח אחד יודע להצפין וגם לפתוח את ההצפנה.

על המנגנון לעבוד בצורה פשוטה, את הצורה הזו אפשר לפשט כך:

בוב הוא ה Web Server

אליס היא Alice.

אליס ובוב רוצים לדבר בצורה מאובטחת, אך באמצע יש את ג’ון, ג’ון מאזין לשיחה בינהם.

אליס ובוב בוחרים צבע ששניהם מסכימים עליו

נאמר כחול, אך ג’ון השיג את הצבע גם

כעת אליס בוחרת צבע פרטי, הצבע הזה הוא ירוק

בוב בוחר צבע פרטי הוא אדום

את הצבע הפרטי הם לא מעבירים אחד לשני כך שג’ון לא ידע.

הם מערבבים את הצבע הפרטי שלהם עם הצבע הציבורי

אליס (כחול וירוק) = תכלת

בוב (אדום וכחול) = סגול

כעת לכל אחד מהם יש את העירבוב שיצא מהשילוב של הצבע הפרטי עם הצבע הציבורי

כעת בוב מעביר לאליס את הצבע המעורבב שיצא לו

אליס מעבירה לבוב את הצבע המעורבב שיצא לה

ממש כמו בתרשים

אבל גם ג’ון קיבל את הצבעים המעורבבים שלהם, אבל משו אחד חסר לג’ון, הצבעים הפרטיים שלהם.

כעת כל אחד מהם לוקח את הצבע הפרטי שלו

אליס – ירוק

בוב – אדום

ומערבבים את הצבע הפרטי שלהם עם הצבע המעורבב אחד של השני, ממש כמו בתמונה

התוצאה: וורוד, הצבע הסודי הוא וורד שהוא המפתח המשותף

בגלל שג’ון לא קיבל את הצבע הפרטי הוא אינו מסוגל להגיע למצב של הצבע הוורד

אתם בטח אומרים אבל יש לו את ה Mixture שינסה לשחזר את הערבוב של 2 הצבעים ואחד מהם הוא הצבע הפרטי.

בדיוק, שכמו שלכם יהיה קשה להבין מה היה הערבוב המקורי (מה היו שני הצבעים שעורבבו) ובמציאות זה פעולה מתמטית, שכן לבצע Reverse יהיה כמעט בלתי אפשרי.

זה ממש כמו מנעול,

קל בכיוון אחד (קל לקחת שני צבעים ולערבב ולקבל תוצאה)

אך קשה בכיוון השני (לקחת את הצבע שיצא מהעירבוב ולגלות את שני הצבעים שיצרו אותו)

לדבר הזה קוראים, One Way Function – פונקציה חד כיוונית

Diffe Hellman Arithmetic’s

כאשר השרת רוצה ליצור את הMaster Key הוא משתמש בAES אבל על מנת להחליף אותם בין השרת ללקוח וההפך אנו משתמשים ב Diffie Hellman

אז כיצד הוא עושה את זה?

נתחיל מהחישוב המתמטי

modulo

לטכניקה הזו קוראים Modulo Arithmetic’s  מתכנתים מכירים את זה טוב אבל אנסה להסביר בצורה פשוטה, דמיינו שעון, על בראש השעון יש 0 ואז 1 ואז 2 וכו’ בסוף כאשר מגיעים לסוף השעון (נאמר איפה שהשעה 00:00 בלילה) ושם קיים P ונאמר שP הוא 100.

אנחנו לא נרד מתחת לאפס ונעלה מעל P שהוא נאמר 100 המקסימום יהיה 2048 Bit (נכון שאני מייצג את 100 בצורה לא נכונה, על מנת להסביר את זה בצורה פשוטה אני מציג את זה כך)

לדוגמה נרצה לדעת מה התשובה ל

50 modulo 12 = 2

על מנת לקבל את התוצאה, ניקח נאמר חבל באורך 50CM

ניקח שעון, נסבוב את החבל על השעון עד שייגמר

הסיום של החבל הוא על 2, לכן התוצאה היא 2

50 modulo 12 = 2

על מנת שזה יעבוד אנחנו צריכים מספר ראשוני,

נאמר המספר 50 וה Root Primitive Number נאמר 17

N = 50

G = 17

X = כל מספר בין 0 ל N שהוא 50

כעת עלינו להשתמש בנוסחא

G^X modulo P =

17^3 mod 50 = 13

קל לחשב את התוצאה אם ידוע X אבל אם לא ידוע אז הנוסחה תראה כך

17^x mod 50 = 13

על מנת לחשב 13, עלינו לבצע ניסוי ותהייה , במספרים קטנים זה סבבה וקל, אבל במספרים ארוכים מאוד, היכולת לנחש את X יכולה להגיע לאלפי שנים גם עם מחשבי על (לפחות כיום) זאת כיוון שאנחנו נכניס ב P מספר ארוך מאוד אוך אפילו יותר ארוך מזה: 15156156156456489489492189498474119

הבעיה הזאת בלמצוא את X נקראת: Discrete Logarithm problem

בוב ואליס

נאמר ואליס היא הלקוחה ובוב הוא השרת.

אליס ובוב מחליטים על 2 ערכים זהים

  • ניתן לבצע בגוגל את החישוב כך :

17^8 mod 50

נמשיך:

ה Generator, וה Prime Module

P = 50

G = 17

הנוסחא

17 modulo 50

אל תשכחו את ג’ון, ג’ון מאזין לשיחה של בוב ואליס

לאחר שהחליטו על G ו P גם לג’ון יש אותם

כעת אליס בוחרת מספר פרטי (לא ראשוני)

נאמר 6

Xalice = 6

כעת אליס תניח את הX שלה במשוואה

17^X modulo 50 =

17^6 modulo 50 = 19

כעת אליס שולחת את התוצאה, לעולם לא את המספר הפרטי שבחרה

היא שולחת לבוב את 19

כעת בוב בוחר מספר פרטי, נאמר

8

Xbob = 8

17^X modulo 50 =

17^8 modulo 50 = 41

בוב שולח רק! את התוצאה לאליס שהיא 41

המצב כעת,

אליס שלחה לבוב את ה התוצאה ובוב שלח לאליס

הבחינו בתמונה שגם לג’ון יש את המספרים

כעת בוב ואליס מניחים את המספר הפרטי שלהם מעל המספר שהוא התוצאה

כעת אליס לוקחת את התוצאה של בוב בריבוע של המספר הפרטי שלה

בוב עושה אותו דבר, לוקח את התוצאה של אליס בריבוע של המספר הפרטי שלו

ומניח בנוסחא

Alice

41^6 Modulo 50 = 41

Bob

19^8 Modulo 50 = 41

התוצאה זהה

ג’ון לא יכול לגלות את המפתח שנוצר כיוון שאין לו את המספר הפרטי לא של אליס ולא של בוב והוא תקוע בבעית ה Discrete Logarithm problem

חולשות במנגנון Diffe Hellman

נחזור שוב לDiffe Hellman, נעבור ישר לתהליך עצמו בו אליס ובוב יוצרים לעצמם Shared Key

זה התרשים שראיתם קודם בו אליס מעבירה לבוב את ה Public Key החישוב שיצא לה וגם בוב שלח לה את החישוב שיצא לו

RSA

RSA הוא השימוש בהצפנה אסימטרית – חד כיוונית כאשר המפתח הציבורי מצפין את המידע ורק המפתח הפרטי יכול לפתוח את ההצפנה,

כאשר המחשב שלכם ניגש לאתר, הוא בודק את התעודה של האתר ובודק את כל הפרטמרים על מנת ל”סמוך” על האתר

נחזור שוב לבוב ואליס (הכוכבים שלנו!) אליס שולחת לבוב HandShake בו היא מציגה לו איזה Ciphers היא תומכת,

בוב שהוא השרת בוחר נאמר AES ומפה מתחיל Diffe Hellman, אך על מנת שהמידע לא יעבור “לא מוצפן” בוב מצפין את החישובים של Diffe Hellman בעזרת ה Private Key שלו וחותם עליו דיגיטלית

נכון, גם לג’ון יכול להיות ה Public Key וכך הוא יכול לפתוח את ההצפנה, אבל שינוי של החתימה הדיגטלית תשנה את המסמך, ובכך אליס תדע שמישהו “התעסק” (tamper) עם המידע.

המפתח הפרטי של בוב “חתם” והצפין את המידע, ג’ון אולי יכול לפתוח את המידע, אך לא לחתום שוב את המידע (שהוא שינה או ישנה) שכן אין לו את המפתח הפרטי של בוב.

רק לשרת יש את ה Private Key!!!

כאשר בוב שולח כך את המידע הוא מצפין וחותם אותו, כאשר אליס רוצה לשלוח את ה”חישובים” של Diffe Hellman היא מצפינה אותם בעזרת ה Public Key של השרת, מצב כזה יאפשר רק לשרת לפתוח את המידע (עם ה Private Key)

Diffe Hellman ללא RSA

ללא השימוש בRSA בתחילת ה Diffe Hellman יכול התוקף לבצע את התהליך הבא:

כעת ג’ון מתוחכם יותר, אין RSA ובוב ואליס מתחילים להעביר את התוצאה

אליס ובוב קבוע

P = 50

G = 17

ג’ון מיירט את זה.

אליס עושה את החישוב

17^6 Modulo 50 = 19

ומעבירה את ה19 לבוב, אך אבוי, ג’ון יושב באמצע פתוח את ה Packet ומשנה אותה, למה הוא משנה אותה?

ג’ון מונע מהPacket להגיע לבוב, ו”מתחפש לבוב” (אין שום אינדיקציה שזה לא בוב)

כעת לג’ון יש את 19, התוצאה של אליס אל מול ה Modulo

וכעת ג’ון משתמש ב

P = 50

G = 17

מציב והתוצאה שלו היא 47

כעת ג’ון מעביר את 47 לאליס (בתואנה שהוא בוב)

כעת ג’ון שולח הודעה לבוב בתואנה שהוא אליס, ושולח לו את התוצאה שלו שהיא 47

כעת בוב מחזיק בתוצאה של “כאילו אליס” (ג’ון) 47 וכעת בוב מבצע חישוב משלו על מנת לקבל תוצאה

17 ^8 modulo 50 = 41

בוב מעביר את 41 לג’ון (חושב שזו אליס)

כעת ג’ון, מחשב את התוצאה של אליס ובוב

Alice – 19^9 modulo 50 = 29

Bob – 41^9 modulo 50 = 11

ה Shared Key שחישב ג’ון הוא 29 לאליס ו 11 לבוב

כעת אליס עושה חישוב עם המפתח הציבורי של בוב (אילו בוב,בתכלס ג’ון) אל מול המפתח הפרטי שלה

התוצאה היא

29

כעת בוב לוקח את המפתח הציבורי שהוא קיבל מאליס (כאילו אליס בתכלס ג’ון) בריבוע של המפתח הפרטי שלו

התוצאה:

11

צבעתי לכם בצהוב את “Shared Key” בו ישתמשו אליס ובוב לתקשר, עם מי? עם ג’ון, הם רק חושבים שזה אחד עם השני, ג’ון יעביר את ההודעות אחת לשניה ובכך ישמש כמתווך הקורא את כל ההודעות שלהם

ג’ון בעצם הוא MITM ומשמש כתוקף היושב באמצע.

מאמרים קשורים

1 comment

י. מלכא 28/01/2018 - 09:48

מעולה!

Reply

Leave a Comment