
הטקסט המלא של הדקות הראשונות בהרצאה «Secure Code» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לנושא מאוד מעניין שהוא חלק מנושא גדול יותר שנקרא סקיוריטי. הנושא שאנחנו הולכים לראות נקרא סקיור קוד. המטרה שלנו כרגע זה להגן על הקוד שאנחנו כותבים.
תחשבו על זה, אתם עכשיו משקיעים שנה, שנתיים, אולי אפילו שלוש שנים בלכתוב איזושהי מערכת.
אם אתם חלק מחברה, יכול להיות שהחברה עובדת עוד הרבה שנים נוספות, ובסופו של דבר בניתם קובץ אקסקיושן ודיאללים ואתם עכשיו לוקחים את הקובץ אקסקיושן הזה והדיאללים אולי גם בעזרת ערכת התקנה ומוכרים אותם ללקוח.
עכשיו יש ללקוח קובץ אקסקיושן. האם הלקוח יכול להתבונן בקוד האמיתי שאתם כתבתם? האם הוא יכול לפתוח קבצים מסוימים שאתם מתעסקים איתם?
האם הוא יכול להסתכל על כל מיני נתונים שנמצאים בתוך או תקשורת נתונים שעוברת מהפרויקט שלכם החוצה ופנימה, אז למעשה הוא יכול לעשות המון דברים בכדי לדעת מה הקוד שכתבתם, איך הקוד נראה, איזה דברים עשיתם,
מה התכנים של קבצים וכולי. הרבה פעמים קורה שאנחנו נרצה להגן מבחינת כל מיני אספקטים על היכולת הזאת של המשתמש קצה. כמעט תמיד אנחנו לא נרצה שהמשתמש קצה שלנו יתבונן בקוד שאנחנו כתבנו, ממש בשפת C-Sharp.
כמעט תמיד אנחנו לא נרצה שהוא יסתכל על קבצים שהוא בכלל לא אמור לראות אותם ולהבין אותם. לכן אנחנו הולכים עכשיו לעבור על סדרה של פעולות שכדאי לנו להיות ערים לגביהם, ואולי כדאי לנו גם לשלב אותם בקוד כאשר אנחנו מפתחים, בכדי למנוע כמה שיותר מצבים כאלה ממשתמש הקצה
שלנו. אז בואו נעבור על סדרה של נקודות, ובחלק מהם אנחנו הולכים להראות דוגמה. אז שוב, המטרה, אנחנו לא רוצים שמשתמש הקצה ייקח ויתבונן בקוד שלנו או בנתונים שהקוד שלנו מתעסק בהם.
הדבר הראשון שאנחנו צריכים להיות ערים לגביו זה כל הנושא של סיסמאות. אם אנחנו מקבלים סיסמה מהמשתמש, ובוא נניח שאף אחד אחר לא ראה את הסיסמה הזאת, רק המשתמש שהכניס את הסיסמה, עדיין בסופו של דבר אנחנו רוצים לשמור את הסיסמה איפשהו, כנראה באיזשהו דאטאבייס.
אם אנחנו לוקחים את הסיסמה כמו שהיא ושומרים אותה בדאטאבייס, זאת פעולה לא נכונה לביצוע ואיזושהי סכנה, מפני שיכול להיות שיש כל מיני אנשים שיש להם גישה לדאטאבייס שלנו.
אם הדאטאבייס יושב על איזשהו שרת, אולי מי שאחראי על השרת, איזשהו טכנאי שיכול להתבונן בקבצים ובמחשב עצמו של השרת, חשוב מאוד לקחת את הסיסמה ולבצע איזשהו ערבול איתה בכדי לשנות אותה בצורה כזאת שגם לא ניתן בכלל יהיה להחזיר את הערבול שביצענו בחזרה לסיסמה.
זה דבר אחד שאנחנו הולכים לראות ממש עוד מעט. הדבר הבא שכדאי לנו להיות ערים לגביו זה שיכול להיות שאנחנו עובדים עם קבצים, ויכול להיות שבקובץ שאנחנו עובדים איתו יש מידע רגיש.
כאן אנחנו צריכים לקחת טכניקה אחרת מהטכניקה של הסיסמאות ופשוט להצפין את הקובץ וגם לפענח אותו כשאנחנו רוצים להשתמש איתו. את הסיסמה אנחנו יכולים רק להצפין ולא לפענח אם אנחנו משתמשים בטכניקה שנקראת hash password וזה לא נקרא הצפנה ופענוח זה נקרא פשוט ביצוע פעולת hash על סיסמאות.
אז אנחנו הולכים לראות גם את הטכניקה של encryption ו- decryption. כאן אנחנו מגיעים עכשיו לקוד שכתבנו. אנחנו יודעים שאנחנו כותבים קוד בשפת C-Sharp.
הקוד הזה הולך להיות מתורגם לשפת MSIL. ישנו כלי שאנחנו הולכים לראות אותו, שכל אחד יכול לפתוח את הכלי הזה ובעזרתו להתבונן בקוד שהוא MSIL.
יש לנו אפשרות למנוע את היכולת שלו להתבונן בקוד ה-MSIL בעזרת הכלי הספציפי הזה. אנחנו כבר הולכים לראות איך אנחנו יכולים לעשות את זה. הדבר הבא שכדאי לנו מאוד להיות ערים לגביו, ושישנו כלי אחר שגם אותו אנחנו הולכים לראות שנקרא Reflector והכלי הזה שנקרא Reflector מסוגל לפתוח לנו את קובץ ה-Execution או ה-DLL ולא רק זה שהוא מסוגל להציג לנו MSIL הוא
מסוגל להציג לנו גם את קוד ה-C-Sharp שלנו וגם יכול אפילו לעשות את זה לשפות אחרות חוץ מ-C-Sharp אפילו שאין לו קוד C-Sharp ויש לו רק קובץ Execution או DLL הוא עדיין יכול להמיר אותו בחזרה לקוד המקור C-Sharp שלנו. הפעולה הזאת נקראת Reverse Engineering יש לנו יכולת לא למנוע אותה אבל מאוד להקשות עליה בעזרת כלי שנקרא .Fuse Cator שאנחנו כבר הולכים לראות איך עובדים
איתו. עכשיו כל מה שראינו עד כאן יכול להקשות מאוד על איזשהו משתמש מלראות את הקוד שלנו, לדוגמה שימוש בדות פיוזקייטור שאנחנו כבר הולכים לראות.
אם אנחנו רוצים לבצע הגנה עוד יותר חזקה מזאת, זה אומר שהיוזר שאנחנו מוכרים לו את התוכנה אסור שיגיע לידיים שלו קוד הליבה שלנו בוא נגיד ככה.
אם יש לנו איזה אלגוריתם ראשי שהוא זה שהוא האלגוריתם הסודי שלנו שעליו אנחנו עובדים קשה אז אולי כדאי לנו בכלל לא לשים את האלגוריתם הזה כקובץ Execution ODLL אצל הלקוח.
כאן אנחנו יכולים לתת ללקוח איזושהי אפליקציה שהיא רק מהווה User Interface טיפש כזה. זה בדרך כלל נקרא Slim Application, ה-Slimser הזה, או Slim UI.
ומה שקורה זה יש לו רק את ה-User Interface, את החזות של האפליקציה. אם הוא רוצה לבצע פעולות, אנחנו מבצעים גלישה למשהו שנקרא Web Service.
וכאן בעצם אנחנו יכולים ב-Web Service הזה, שזה איזשהו שירות שקיים אי שם באינטרנט, שהוא שלנו כמובן, לגלוש אליו מהמחשב של המשתמש, מה-user interface הטיפש כביכול, שם בשרת מתבצע הקוד הליבה שלנו, החישובים המרכזיים, ואנחנו מחזירים לעוד תוצאה.
אז היתרון, כמובן הקוד עצמו בכלל לא נמצא אצל המשתמש, קובץ ה-execution או ה-dll בכלל לא נמצאים אלא נמצאים בשרת מרוחק. החיסרון, חובה שיהיה לו קו אינטרנט שזה לא תמיד חיסרון כי בהרבה מקומות יש, וכאן אולי גם יש את הקטע של האיטיות עד שהוא ירוץ לשרת ואולי השרת עמוס,
אז כמובן שיש פה את החסרונות של הדבר הזה, אבל זה הרבה יותר secured כאשר הקוד שלנו נמצא במקום מרוחק ולא אצל המשתמש. אז פה אנחנו רואים באופציה הזאת את האפשרות של המשתמש יהיה חלק מהקוד והליבה של הקוד נמצאת בשרת מרוחק.
כל הקונספט של Web Services לא נמצאים בסקופ של המודול הזה, אבל כמובן שישנו מודול אחר וקורס אחר שמתעסק עם כל הקונספט של איך להרים שירות לאוויר בשיטת Web Service ובשיטת WCF שהיא הרבה יותר חדשה והרבה יותר חזקה.
אז זאת גם כן אופציה שכדאי לנו לקחת בחשבון. האופציה הבאה מאוד מעניינת, אולי כדאי בכלל לא לכתוב דסטופ אפליקיישן מלכתחילה. זאת אומרת, דסטופ אפליקיישן זו אותה אפליקציית קובץ אקסקיושן, ווינפורם, קונסול אפליקיישן, WPF,
כל הדברים האלה נחשבים דסטופ אפליקיישן, שבסופו של דבר אנחנו מביאים ללקוח קובץ אקסקיושן, ועכשיו יש לו משהו ביד, שאותו הוא יכול להתחיל לפתוח ולראות.
אולי כדאי בכלל לעבור לטכניקה אחרת שהיא מאוד מאוד נפוצה היום בעולם, וזה בכלל לא לבנות דסטופ אפליקיישן אלא אתר אינטרנט. ברגע שאתם עושים את זה, אין ללקוח שום דבר, הוא יכול לגלוש לאתר רק בעזרת דפדפן ומקבל רק User Interface בשפת HTML.
גם אם יש Web Service וגם אם יש אתר אינטרנט, זה לא אומר שהWeb Service והאתר אינטרנט הם חסינים מפני פריצה, אבל זה הרבה יותר סקיורט מאשר נתנו לבן אדם את הקוד שלנו בתור קובץ Execution או DLL. בכל מקרה, גם כל התחום של בניית אתרי אינטרנט לא נמצא בסקופ של המודול הזה, ויש כמובן קורס נפרד של איך בונים אתר אינטרנט
בשיטה החדשה ביותר, בשיטת MVC, מודל View Controller, וגם בשיטת ASP.NET, הכל נמצא בקורסים נפרדים במכללה שלנו. הדבר הבא שכדאי לנו מאוד להיות ערים לגביו זה מה שנקרא EULA. EULA זה ראשי תיבות של End User Lab.
License Agreement זהו מסמך משפטי מאוד חשוב שגם אם יש לנו אתר אינטרנט וגם אם יש לנו אפליקציה בוא נגיד שאתר זה פחות שימושי אבל בוא נניח אם הוא מוריד איזה משהו מהאתר או שהוא משתמש באיזשהו שירות באתר אנחנו יכולים לשלב את זה שם אבל בטוח שאם אנחנו נותנים למשתמש אפליקציה כדאי לנו מאוד לשלב את המסמך המשפטי הזה ובייסיקלי המסמך המשפטי הזה זה אותו מסמך
שמבקש מכם לאשר את תנאי השימוש שכל הזמן אנחנו אומרים לו כן, וכמובן שאנחנו קוראים את הכל בתשומת לב, אבל זה לא משנה, עדיין המסמך הזה הוא מאוד מאוד חשוב, כי אם אנחנו הצלחנו לתפוס מישהו שגנב לנו קוד, אז כמובן שהמסמך הזה יכול לעמוד לזכותנו ולרעתו
בבתי משפט, גם שהמסמך הזה כמובן יכול להפחיד אנשים מלעשות דברים ועל ה-safe side כדאי מאוד שהמסמך הזה ישולב באפליקציה.
ניתן כמובן להשיג את המסמכים האלה בצורה יחסית חינמית ברשת, לא יודע כמה מסמך כזה יהיה חזק אם אנחנו מורידים איזה טמפלייט חינמי שלו ורק מחליפים את השמות של החברה או של המוצר, אבל בעצם אם אנחנו מארגנים כבר איזשהו מוצר למכירה כדאי לקחת
איזשהו עורך דין שיתפור לנו איזשהו מסמך כזה שהוא ספציפי לגבי החברה והמוצר שלנו וזה מאוד מאוד חשוב לשלב אותו בערכת ההתקנה בכדי שהלקוח יסמן שהוא מסכים לתנאי השימוש שלנו ורק אז הוא יוכל להתקין או להוריד את השירות.
אז בואו ניכנס ונראה לפחות את ארבעת הדברים הראשונים hash password encrypt decrypt suppress msil disassembly ועבדה עמדות fusecator בכדי לעשות את הקודים שלנו יותר secured אוקיי אז הדבר הראשון שאנחנו יכולים לראות ואיך אנחנו מבצעים פעולה שנקראת hash password מיועדת לסיסמאות קודם כל אם אנחנו רוצים לעשות את זה בעזרת איזושהי פונקציה
מאוד פשוטה שקיימת אצלנו אז אנחנו יכולים או יותר נכון אנחנו צריכים קודם כל לגשת לפרופרטיז ולראות מהי גרסת הפריימוורק. בואו נפתח את הפרופרטיז ונראה שגרסת הפריימוורק היא .NET Framework 4 Client Profile ואנחנו לא יכולים לעשות כמעט שום דבר עם הגרסה הזאת לכן נחליף אותה ל- .NET Framework 4.0
שיש בה הרבה יותר דברים שקשורים לסרבר, לשרת. אוקיי, יש לנו פה איזה סגירה של הפרויקט ונפתח אותו מחדש. אוקיי, עכשיו מה שאנחנו צריכים לעשות זה לצרף רפרנס שנקרא system.web בואו נחפש אותו הנה הוא פה framework 4.0 או framework אחר system.web כאן יש לנו איזושהי מחלקה שנקראת forms
authentication נמצאת בסיסטם web security לפורמז אורטנטיקיישן יש פונקציה סטטית שנקראת אש פסוורד פור סטורינג אין קונפיג פייל והפונקציה הזאת אומרת לנו תביאו לי סיסמה בבקשה.
אוקיי בואו ניקח פה סטרינג פסוורד ואנחנו רוצים לקלוט את הסיסמה הזאת מהיוזר קונסול רידליין נגיד למשתמש לדוגמה enter your password ואנחנו רוצים לקחת את הפסוורד הזאת לשלוח אותה לפונקציה ואנחנו צריכים לתת עוד דבר אחד וזה אלגוריתם הצפנה.
יש כל מיני אלגוריתמאי הצפנה אחד מהם נקרא SHA-1 יש אלגוריתם שנקרא MD-5 ויש עוד הרבה אלגוריתמים כאלה שמסוגלים לבצע משהו שנקרא hash, פסוורד בואו ניקח SHA-1 ואנחנו רואים שכל הפקודה הזאת מחזירה לנו את הסיסמה הכביכול מוצפנת.
בואו נראה, ניקח פה אש פסוורד, ניקח פה פליין פסוורד, והאש פסוורד שווה לכל הסיפור הזה, ואנחנו יכולים לסגור, ואנחנו רוצים להציג גם את הסיסמה פליין פסוורד וגם את ההאש. בעצם את הפליין אני לא צריך להציג מפני שקיבלתי אותה מהמשתמש.
יש לי פה איזו בעיה. יאללה בואו נריץ את זה ונגיד למשתמש בוא תכניס לי בבקשה סיסמה. עכשיו שימו לב שהמשתמש כמובן רואה את מה שהוא מקליד ובמציאות אנחנו לא רוצים שזה יהיה.
אם אנחנו מתעסקים עם טופס חשוב שנסתיר את האפשרות הזאת על ידי הטופס. יש לנו שם בתיבת טקסט אפשרות להגדיר password char בתוך תיבת טקסט ואז היוזר בכלל לא רואה את מה שהוא מקליד אלא רואה עיגולים או כוכביות.
אז כרגע רק לצורך הדוגמה אני כן רוצה לראות והסיסמה שהכנסתי זה הלו ושימו לב שהפונקציה האש פסוורד הזאת נותנת לי מכרוזת מאוד ארוכה. אוקיי, תזכרו שהמכרוזת מתחילה ב-F7FF9 וכולי אם אני אריץ את זה שוב ואקבל מכרוזת אחרת לדוגמה וואטסאפ אז פתאום אני רואה מכרוזת אחרת 4EB2 האם זה רנדומלי?
זה לא רנדומלי. נכניס עוד פעם Hello ונקבל את אותה מכרוזת בדיוק F7FF9 וכולי. זאת אומרת מכרוזת ספציפית שאנחנו מכניסים סיסמה ספציפית נותנת לנו מכרוזת מעורבלת כל פעם זהה לחלוטין אם אנחנו כל פעם מכניסים סיסמה זהה לחלוטין.
זה נקודה אחת שחשוב להבין בנוגע לאלגוריתם האש הזה. הדבר השני זה שלא ניתן, לפחות ככה אומרים, לחזור אחורה. אם אני מביא לכם את המחרוזת הזאת, הארוכה הזאת, שעברה האש, מעין הצפנה כזאת, אין שום אפשרות מבחינת אלגוריתם שיצר את זה לחזור אחורה להלואו.
אני יודע שזה נראה מוזר, אבל זה מה שמספרים על מנגנון ההאש. זאת אומרת שפיתחו איזשהו מנגנון אלגוריתמי כזה מתמטי, תנו לו מחרוזת, הוא מצליח לספק לכם ערבול שלה, לא מצליח לחזור אחורה בשום מקרה.
האלגוריתם עצמו לא מסוגל לעשות את זה, גם אם יש לכם את האלגוריתם. אז כאן נשאלת השאלה, אוקיי, יוזר עשה רג'יסטריישן. אני לא רוצה לשמור לו את הסיסמה המקורית בדאטאבייס בשום מקרה.
יש מלא אנשים, יש לכל מיני אנשים גישה לדאטאבייס, יכולים לראות את הסיסמה שלו. עשה לי רג'יסטריישן, הכניס לי הלו, אחלה. אני מיד מעביר את הסיסמה אשינג, וזה אני שומר בדאטאבייס.
אבל מה קורה אם מחר הוא עושה לוג אין, לא רג'יסטריישן, ועוד פעם מכניס לי את המילה הלואו? הרי אני לא יכול עכשיו, לפי מה שאמרנו, לקחת מהדאטאבייס את המחרוזת ההאש הזאת הארוכה, להחזיר אותה בחזרה ולראות אם ההלואו שהוא הכניס לי זהה להלואו שהוחזר בחזרה, כי אמרנו שאנחנו לא יכולים להחזיר בחזרה את ההאשינג.
מה אנחנו כן יכולים לעשות? אנחנו יכולים להשתמש בקונספט הראשון שלמדנו שאם בפעם הבאה הוא מכניס את המילה הלו עוד פעם נקבל את אותה מכרוזת ואז אני מבצע עוד פעם האשינג על מכרוזת הלוגאין שלו ומשווה אותה עם ההאשינג שנמצא בדטאבייס.
זאת אומרת מה שאני משווה זה אף פעם לא את הסיסמאות המקוריות של היוזר אלא אני משווה את ההצפנות לעצמן או את את הסיסמה שעברה האשינג, אני מצפין, או אני מעביר אותה האש, ואני משווה אותה לסיסמה שעברה האשינג שנמצאת בדאטאבייס.
אני משווה את שני המחרוזות הארוכות האלה. אם שתיהן שוות, זאת אותה הסיסמה כמובן שהוא הכניס. אם הן לא שוות, הוא הכניס לי סיסמה אחרת, ביי ביי.
עכשיו, מה קורה אם היוזר שכח את הסיסמה? אני לא יכול להחזיר לו אותה. כאן אתם צריכים להיזכר אולי נתקלתם במצבים ששכחתם סיסמה וביקשתם שיחזרו לכם סיסמה ולא החזירו לכם את הסיסמה המקורית אלא יצרו לכם סיסמה רנדומלית חדשה ואמרו לכם הנה סיסמה רנדומלית חדשה תיכנסו איתה ובפעם הראשונה תשנו אתם את הסיסמה כל פעם שאתם רואים את הדבר הזה זה אומר שמי שעשה את זה כלומר אותו אתר
או אותה תוכנה צפינה על ידי האש את הסיסמה שלכם ולכן היא לא יכולה להחזיר לכם אותה אחורה ואז היא נותנת לכם איזושהי סיסמה רנדומלית ואומרת לכם קחו סיסמה חדשה אנחנו לא יכולים להביא לכם את הקודמת.
אם יש איזשהו מקום שכן מצליח להביא לכם את הקודמת אולי הוא מבצע איזושהי הצפנה של הסיסמה שלכם ופענוח אבל זה לא האשינג. אז כאן יש לנו את היכולת לבצע כרגע האשינג בצורה פשוטה על ידי כמה שורות קוד ולייצר איזושהי מחרוזת שאותה אנחנו שומרים ומשווים תמיד אליה את ההצפנות החוזרות ונשנות.
אוקיי בואו נראה עוד משהו מעניין בקשר לזה נשים פה breakpoint נרוץ נכניס את אותה סיסמה enter ונסתכל רגע בדיבאג על אש פסוורד נבוא לפה ונסתכל על טקסט ויז'יואלייזר למה בשביל להעתיק את הדבר הזה בואו נעשה לזה קופי ואני רוצה לראות אם באמת אין שום אפשרות חזור אחורה, אוקיי, נסגור את זה, נסגור את התוכנית, העתקנו לה קליפבורד ונפתח את הדפדפן.
כאן אנחנו נכנסים לאתר אינטרנט, או ליתר דיוק בואו נחפש אתר אינטרנט, ונחפש את המחוזת dript1 ונתחיל לחפש האם אתר אינטרנט מסוגל לפענח לנו את הסיסמה הזאת שהצפנו.
בואו נפתח פה כמה אתרי אינטרנט, ניקח את האתר הראשון, הוא מבקש מאיתנו להכניס פה את המחרובת שלנו, בואו נעשה פה איזשהו פייסט. יש פה פייסט, אני רואה שהוא בורח לי כל הזמן.
או, עכשיו עשינו פייסט, קונטרול V, ונרד פה למטה, ונראה שהוא מבקש מאיתנו להכניס איזה קפצ'ה, זה המספר הזה, או המילה הזאתי.
אז נכניס כאן את ה-P-A-D-O-U-K הזה, ונלחץ על submit בכדי שהוא יפנח לנו את הסיסמה כמו שהוא אומר שהוא יכול. ושימו לב מה הוא כותב לנו כאן בירוק.
Hello, איך זה יכול להיות? הרי אמרנו מקודם שלא ניתן לחזור אחורה. אם אני נותן לכם את הדבר הזה, אי אפשר לחזור אחורה. אי אפשר להשיג לי בחזרה Hello.
לא רק זה, הוא אומר לי שהשתמשתי באלגוריתם שאוואן, והסיסמה המקורית שלי היא Hello. איך זה יכול להיות? למעשה, אי אפשר לחזור אחורה והם לא חזרו אחורה, מה שהם עשו האתרים האלה הם לקחו כמויות עצומות של סיסמאות הצפינו את כולם בעזרת האלגוריתמים האלה שאוואן
ו-MD5 וכולי ושמרו את ההצפנות עצמן במאגר נתונים ואז כאשר אתם מכניסים את ההצפנה אז אומרים לכם אה כן את זה אני מכיר הצפנתי את זה פעם מה שהצפנתי היה אלו אז ככה הם מצליחים להגיד לכם שזה Hello.
זאת הסיבה שתמיד כאשר אתם ממציאים איזושהי סיסמה היא צריכה להיות חזקה. בואו נחזור וננסה לעשות את זה הפעם עם סיסמה הרבה יותר חזקה ונראה אם יצליחו לפענח. בואו ניקח את HelloXY1234 זאתי סיסמה כבר יותר חזקה זאת לא מילה שקיימת שילבתי פה אותיות שילבתי פה ספרות אותיות גדולות אותיות קטנות ספרות בואו נריץ נגיע לכאן נעתיק את ההאש נלך לכאן יש לנו
פה אש אחר כמובן קונטרול c נחזור בחזרה לאתר ונדביק את הדבר הזה ניגש למטה נכניס עכשיו את הקפצ'ה לאווידי נראה לי שזה מה שכתוב פה חצמית ונראה שהוא כותב לנו not found כלומר השתמשנו במשהו שהוא טיפה יותר חזק לא מוצאים זאת הסיבה שתמיד אתם צריכים להשתמש בסיסמאות הרבה יותר
חזקות מאשר סתם מילה בודדת כי את כל המילים האלה כבר פיינחו ויודעים איך ההאשינג שלהם נראה אז אנחנו יכולים כבר להיפטר מהדפדפן להיפטר מזה אוקיי בסדר ראינו את הקונספט של ההצפנה של ההאשינג ואנחנו יכולים לעבור לנקודה הבאה שראינו במצגת וזה Decrypt ו-Encrypt
כאן אנחנו אנחנו הולכים לראות דוגמה פשוטה שהאמת ראינו אותה באחד הסרטונים של איך אנחנו יכולים להצפין ולפענח טקסטים אז מה שעשינו זה הבאנו איזה שהוא קובץ שפעם לקחתי ויצרתי מכל מיני קודים שונים והקובץ הזה נקרא crypto אז בואו ניזכר מה היה שמה הקובץ הזה מכיל לנו את האפשרות לבצע encryption של טקסט ו-decryption של טקסט
עם שתי פונקציות סטטיות encrypt ו-decrypt ומה שכן הקובץ הזה הפונקציה אומרת לנו תביאו לי טקסט שאתם רוצים שאני אצפין תביאו לי איזשהו shared secret כלומר בעזרת המחרוזת הזאת שאתם מביאים לי אני אצפין ואתם כשאתם רוצים לפענח אתם חייבים להביא לי את אותה מחרוזת שהבאתם לי בזמן ההצפנה למה יש את המחרוזת
הנוספת הזאת כי אחרת לכל אחד היה את האלגוריתם הזה, והוא היה יכול לפענח לכם בקלות אם לא היה את המחרוזת שהיא shared שלכם, רק אתם יודעים מהו ה-shared secret.
אז בואו נגיע לכאן, וניקח פה אותם איזשהו טקסט, String some text, Hello, this is my coolest string ever. אוקיי, ובעצם נקרא לו כמו מקודם plain text.
עכשיו אנחנו רוצים לקחת את המחרוזת, encrypted text לגשת לקריפטו ולקרוא ל-encrypt פה אומרנו תביאו לי את הפליין טקסט ותביאו לי איזשהו shared secret שרק אתם יודעים מהו אוקיי ובואו נביא להם את המחרוזת פרקטיקיו בואו ניקח את הקריפטד טקסט ונפענח את ה-encrypted טקסט בעזרת אותה מחרוזת פרקטיקיו נצפין plaintext encrypted
Decrypted Text, נריץ. אז כמו שאתם רואים אנחנו מצליחים להחזיר אחורה את ההצפנה ולכן זה לא האשינג אלא אנקריפשן רגיל.
אז אנקריפשן רגיל זה כמובן יותר טוב מכלום וכדאי לנו להצפין דברים שמישהו יכול להסתכל עליהם. מה כדאי לנו להצפין? כדאי לנו להצפין טקסטים שנמצאים בהארד דיסק שאנחנו משתמשים איתם, קבצי טקסט, קבצי XML, קבצים בינאריים, כל הדברים האלה, אם יש בהם מידע רגיש והוא
לא סתם הצבעים האחרונים שהיוזר בחר, אלא רשימות מסוימות, רשימה של עובדים, רשימה של ספקים, רשימה של כרטיסי אשראי בוודאי ובוודאי, כל מה שיכול להיות מידע שאנחנו לא נרצה שמישהו יתעסק איתו, אולי כדאי לנו להעביר אותו כזאת איזו הצפנה, וואלה, לא רוצים שאתה תראה מה יש לנו בקבצים האלה.
יש כמובן עוד הרבה דברים שאפשר להצפין, איזשהו קובץ שהרבה פעמים אתם תרצו לעבוד איתו שראינו אותו בעבר אפשר לצרף אותו כאן על ידי add new item וזהו קובץ קונפיגורציה ברמת האפליקציה שלנו הקובץ הזה נקרא appconfig הנה הוא כאן application configuration file והקובץ הזה פשוט מאוד יכול להכיל לנו כל מיני נתונים שאנחנו רוצים לעבוד איתם באפליקציה לדוגמה יש לנו מקום שנקרא app
settings ואנחנו יכולים להוסיף פה אד, ניקח פה איזשהו מפתח, מיין קולור, ואליו, ניקח רד, ניקח כאן אד, בואו ניקח סרבר IP אדרס, אולי אנחנו גם רוצים את זה, ואליו שווה 230, 154, 127,
84, ויכול להיות שזה מידע סוג של מידע רגיש, או הפורט שאנחנו עובדים איתו, נניח 80-85. כל הדברים האלה אולי אנחנו לא רוצים שהם ייראו בצורה כזאת בקובץ ה-XML הזה, וכדאי אולי גם אותם להצפין.
אז גם בקובץ הזה הרבה פעמים קורה שאנחנו שמים מידע ורוצים להשתמש איתו. אולי כדאי להצפין אותו באופן טבעי. אז כאן אנחנו רואים שיש לנו אפשרות לבצע הצפנה ופענוח.
שימו לב רק שאם אני משתמש במחרוזת אחרת בשביל לפענח את מה שהצפנתי אז אני כמובן מקבל exception ואומר לי תקשיב זה בכלל לא אותה מחרוזת אתה לא יכול להשתמש איתה בוא ננסה אפילו עם אות קטנה במקום אות גדולה נראה אם זה k-sensitive מעולה זה k-sensitive אז בכלל
הוא אומר לי אתה חייב להביא לי בול את ה-shared secret שלך בשביל שאני אסכים בכלל לפענח לך את המחרוזת אז גם כאן יש לנו אפשרות להשתמש בקוד הזה והולך להיות לכם כמובן כל הקודים האלה בין התרגילים של הקורס.
יופי. דבר הבא, אנחנו ראינו שאנחנו יכולים להתבונן בקובץ ה-MSIL עצמו.
דבר ראשון, בואו נתבונן ב-MSIL. בואו נבנה כאן איזושהי מחלקה, נבוא לפה ונבנה מחלקה שנקראת Customer, ול-Customer יש First Name, Last Name ואיזושהי פונקציית Print.
בואו נגדיר כזה דבר, customer.details בכוונה נדפיס פה איזה שהיא סטרינג first name last name בצורה כזאת. נגדיר כאן מרחבי שמות נקיים יותר והנה יש לנו customer אנחנו יכולים לשים את ה-customer פה בצד ובמיין להשתמש איתו.
ובואו נבנה פה אובייקט customer c=new customer נכניס כמה ערכים first name last name print נריץ הכל עובד כמו שצריך. כעת בואו ניגש ונגיע לאיזשהו כלי שמאפשר לנו לראות את ה-MSIL.
מה שאנחנו צריכים לעשות זה ללכת ל-Start Programs ולאתר את Microsoft Visual Studio.net. בואו ניגש ונחפש את Visual Studio.net, הנה אנחנו רואים אותו פה, ונלך ל-Tools שלו, וב-Tools שלו אנחנו צריכים לפתוח את ה-Command Prompt, האמת יכול להיות שהכלי
הזה פשוט נמצא פה איפשהו, הנה הוא כאן, דיסאסמבלר אוקיי אם הוא לא היה נמצא כאן שימו לב אני לוחץ עליו והוא נפתח והכלי אז היינו יכולים לעשות משהו אחר כי יכול להיות שבגרסה אחרת של ויז'ל סטודיו הכלי הזה לא יהיה לכם אז מה שאתם יכולים לעשות זה לפתוח את הקומנד פרומפט חלון הקומנד פרומפט
של ויז'ל סטודיו דוט נט וזה בעצם חלון cmd רגיל שורת הפקודה נקרא שאתם יכולים לכתוב פה פקודות שדוטנט מכירה אותה והפקודה שאנחנו רוצים לכתוב זה ILDASM זאת הפקודה והוא יוצר לנו בדיוק את אותו הדבר כמו מקודם את החלון הזה אוקיי נשאיר את זה כאן פתוח ומה אנחנו רוצים לעשות אנחנו רוצים עכשיו לגשת ובעזרת הכלי הזה לפתוח את הקובץ שלנו קובץ
האקסקיושן עצמו שכתבנו ואותו הבאנו כביכול ללקוח בואו ניגש למיי פרוג'קטס ניגש לסקיור קוד אנחנו נמצאים בספרס בין דיבאג והנה קובץ האקסקיושן.
גם אם היה לנו dll בדוטנט היינו יכולים לפתוח גם את ה-dll. כאן אנחנו רואים המון נתונים לגבי אותו קוד, הנה המחלקה פרוגרם והנה המחלקה קסטומר, אנחנו רואים את השמות שלהם, אנחנו רואים שיש להם first name ויש להם last name.
והנה פונקציית פרינט, בואו נלחץ דאבל קליק על פונקציית פרינט ופה אנחנו מגיעים לקוד שכתוב בשפת msil. וכך נראית שפת MSIL. אולי הרבה יותר קשה לקרוא אותה מאשר C-Sharp, אבל זה לא בלתי אפשרי.
יש ספר שמייקרוסופס פרסמה שמראה איך כותבים MSIL וממה השפה הזאת בנויה, ופה אנחנו יכולים אפילו לראות את המחרוזות השונות. הנה Customer Details, פה אנחנו רואים Right Line, כאן אנחנו רואים שיש לנו איזשהו, פה יש לנו עוד Right Line, פה יש לנו השמה לפונקציה.
זאת אומרת, אם אנחנו רוצים, אנחנו יכולים להבין פחות או יותר מה כתוב פה. בואו נסגור את זה, נסגור את זה ונראה משהו שאפשר לעשות.
אנחנו יכולים לגשת ל-properties של הפרויקט שלנו, אנחנו יכולים לגשת ל-assembly info, קובץ שמחזיק לנו כל מיני נתונים ברמת ה-assembly עצמו, ואחד מהדברים שאנחנו יכולים להגדיר זה Attribute ברמת ה-assembly.
אנחנו למדנו מה זה Attribute ולמדנו שאטריביוט ניתן לאיזשהו כלי או רכיב תכנותי שנמצא מתחתיו. אם הייתי רוצה לתת אטריביוט ל-Customer אז הייתי הולך לפה וככה הייתי נותן אטריביוט ל-Customer.
אם הייתי רוצה לתת אטריביוט רק ל-First Name של-Customer ככה הייתי עושה את זה. ופה הייתי נותן את הפקודה לדוגמה Non-Serialized. אבל אם אני רוצה לתת אטריביוט לכל האסמבלי והמקום וכל אלה זה אטריביוט ברמת האסמבלי.
כאן אנחנו יכולים לראות שיש לנו attributes שאומרים מה ה-title של הקובץ וה-description שלו ואיזה חברה אנחנו. ולמעשה, כאשר אנחנו כותבים את כל הדברים האלה בעזרת חלונית ה-properties, כאן אנחנו יכולים לראות שיש לנו Assembly Information, איזשהו קובץ שאנחנו יכולים לכתוב, ולתת פה לדוגמה את ה-Description.
Describes how to suppress MSIL, Disassembly וכו' וכו', בואו נעשה סייב. ברגע שעשינו את הדבר הזה, כל מה שעשינו נכתב בתוך הקובץ הזה. שימו לב שפתאום אנחנו רואים כאן את מה שכתבנו ב-UI שמה, Describes how to suppress, בלה בלה בלה.
אחד מהדברים שאנחנו יכולים לתת ברמת כל ה-Assembly נקרא אסמבלי נקודותיים ספרס איי-אל די-איי-אס-אם כאשר איי-אל די-איי-אס-אם זאת אותה תוכנה שעכשיו ראינו.
בואו נריץ עוד פעם את התוכנית, נראה שהתוכנית עובדת כמו שצריך, אבל ניכנס שוב פעם, נפעיל את האיי-אל די-איי-אס-אם הזה ונפתח איתו את אותו הקובץ שפתחנו מקודם.
בואו ניקח את הקובץ הזה, נלחץ על open ושימו לב מה אנחנו מקבלים. Protected module cannot disassemble, אחלה. כאן חסמנו את היכולת של מישהו לקרוא את ה-MSIL עצמו.
טוב, הנקודה הבאה שאנחנו רוצים להראות, ואפשר להיפטר מזה, אקזיט, זו נקודה עוד יותר חזקה שחוסמת עוד דבר.
אבל בואו רגע נסתכל על משהו מעניין. יש לנו את קובץ האסמבלי שכתבנו והתוכנית עצמה עובדת פרפקט. הנה היא, לא, בעצם זאת לא התוכנית הזאת, לא יודע למה הגעתי אליה, זאת זאת.
וכאן אנחנו רואים שלמרות שאנחנו לא יכולים לראות את ה-disassembler הזה, עדיין התוכנית עובדת כמו שצריך. קיים רכיב שנקרא רפלקטור שדיברנו עליו בהתחלה.
הנה יש לנו פה את הרפלקטור, בואו נפתח אותו. הרפלקטור הזה, יש רפלקטורים שניתנים להורדה בחינם, יש כאלה שעולים כסף, הרכיב הזה בא ואומר לנו כזה דבר.
גם אתם יכולים פה לתת לי איזשהו קובץ Execution או DLL. בואו נפתח Open ונגיע לאותו מקום של הקובץ שלנו. הוא היה בקונן C, היה ב-My Projects, Secure Code, Suppress MSIL, Bין, דיבאג,
Suppress MSIL, ושימו לב שמקודם לא הצלחנו לפתוח את הקובץ הזה בעזרת תוכנת ה... ILDASM כעת קודם כל אני מצליח להראות אותו פה ברשימה בואו נפתח אותו והוא מצליח להציג לי מה יש בתוכו אנחנו יכולים להמשיך לחפור לניימספייס ולראות קסטומר ניכנס לקסטומר ונראה את מה שמקודם לא הצלחנו לראות זאת אומרת התוכנה
הזאת הספציפית כן מראה לנו מה שהתוכנה של מייקרוסופט ה-ILDASM לא הצליחה להראות אם שמנו את הדגל ההוא אז בואו נלחץ על פרינט, דאבל טליק, ושימו לב אפילו מה אנחנו רואים.
אנחנו בכלל לא רואים את הקוד כ-MSIL אלא כ-C-Sharp טהור, שזה עוד יותר מסוכן ובעייתי כי עכשיו היוזר ברגע שהוא קיבל את קובץ האקסקיושן הוא יכול לפתוח אותו ולראות את הקוד הסודי שכתבנו.
לא רק זה הוא יכול לבחור פה באיזה שפה הוא רוצה לראות את הקוד הזה. זאת אומרת אם הוא מכיר ויז'ואל בייסיק יותר טוב מ-C-Sharp, כל מה שהוא צריך לעשות זה לראות את הקוד בוויז'ואל בייסיק.
ככה הקוד נראה בוויז'ואל בייסיק, אין נקודה פסיק בסוף משפטים, פרוצדורה או פונקציה מתחילות בפאבליק סאב ומסתיימות באנס סאב, וממש רואים את הקוד שכתבנו בכל שפה שנרצה.
נחזיר את זה ל-C-Sharp, שימו לב שאם אנחנו רוצים אנחנו יכולים להעביר אותו גם ל-IL, זאת אומרת שהוא בכלל גם מראה לנו פה את הקוד ב-MSIL.
מה שמעניין וטוב בכלי הזה זה שהוא יכול לשמש אותנו בתור מתכנתים בשביל להגיע לכל מיני מחלקות שימו לב שאני יכול להגיע ל-right line ולראות איך right line עצמה כתובה ואז ללמוד הרבה לגבי הקודים של המערכת איך הם בנויים בתוכם מה הם עשו שימו לב אני ממש נכנס לקוד של right line ורואה איך הוא כתוב זה ממש יכול לשרת אותנו בפיתוח עצמו בואו אבל נחזור בחזרה ואנחנו רוצים איפשהו למנוע
את הדבר הזה אז למעשה לא ניתן למנוע לחלוטין את הפתיחה של הקוד שלכם על ידי רפלקטור, אבל מה שכן ניתן זה לעבוד עם איזושהי תוכנה שמערבלת את הקוד.
מה זה אומר מערבלת את הקוד?