Tags: | Categories: Security Posted by talgiladi on 12/7/2009 1:43 PM | Comments (0)
הפעם נדבר על הצפנה אסימטרית. מה הכוונה? ובכן, החיסרון הכי גדול של הצפנה סימטרית הוא כיצד להעביר לצד השני את המפתח/סיסמא. הרי הסיבה העיקרית שרצינו להשתמש בהצפנה היא כי אנחנו לא בוטחים בדרך שהמידע עובר בה ובאנשים שיראו אותו בדרך, אז איך נעביר את המפתח באותו הדרך??אז יש פיתרון... הצפנה אסימטרית. הפעם אין מפתח אחד שיכול גם להצפין וגם לפתוח את ההצפנה, אלא יש מפתח אחד (מפתח פרטי) שיכול גם להצפין וגם לפענח את ההצפנה, ויש מפתח אחד (מפתח ציבורי) שיכול רק להצפין. אז מה יצא לנו מזה? ככה, אנחנו מפרסמים לכולם את המפתח הציבורי שלנו, אז הם יכולים כעת להצפין את המידע מאצלהם, ואז לשלוח אלינו, ורק אנחנו עם המפתח הפרטי יכולים לפענח את ההצפנה... נחמד...ואם אני רוצה לשלוח להם תשובה מוצפנת בחזרה? אז שוב, או שהצד השני ישלח לי מפתח ציבורי משלו, ואז לאחר שאצפין את התשובה עם המפתח שלו, אחזיר לו את המידע המוצפן והוא יפענח אותו עם המפתח הפרטי שלו, או, שבעזרת המפתח הציבורי ששלחתי לצד השני בהתחלה, הוא יצפין לי מפתח/סיסמא להצפנה סימטרית ואז פשוט נמשיך את השיחה שלנו בעזרת הצפנה סימטרית(שזו השיטה הסטנדרטית שבה עובד SSL) . למה שיטה זו עדיפה? ובכן, ההצפנה האסימטרית דורשת הרבה מאמץ מהמעבד והיא מאוד איטית ביחד לשיטה הסימטרית.ועכשיו לקצת קוד:
קודם ניצור זוג מפתחות , אם עדיין אין לנו:המחלקה ב C# שמשמשת להצפנה אסימטרית נקראת RSACryptoServiceProvider (שלוש אותיות ראשונות על שם בוני האלגוריתם...)
ניצור אובייקט חדש, והוא כבר ייצר עבורנו זוג מפתחות:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider ();

את המפתח הפרטי (שלנו, שיכול לגם לפענח וגם להצפין) ניצור באמצעות הפונקציה ToXmlString עם פרמטר true להוספת המידע של מפתח פרטי בסטרינג שמתקבל:
 
string privateKey= rsa.ToXmlString(true);
 
את המפתח הציבורי ניצור באותה שיטה אך על ידי שליחת ערך false כדי שלא להוסיף את המידע על מפתח פרטי לה
string publicKey = rsa.ToXmlString(false);
כעת נפרסם את המפתח הציבורי שלנו, ומי שירצה להצפין לנו הודעה ישתמש בו בעת ההצפנה:
 ניצור אובייקט הצפנה:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider ();
 
נאתחל אותו עם המפתח הציבורי:
rsa.FromXmlString(publicKey);
 
נהפוך את המידע שאנו רוצים להצפין למערך בתים:
byte[] clearData=Encoding.UTF8.GetBytes(clearText);
נבצע את ההצפנה :
byte[] encryptedData = rsa.Encrypt(clearData, false);
 
ונהפוך חזרה לסטרינג שניתן לשליחה בתור טקסט באימייל או דף אינטרנט:
 
string encryptedString = Convert.ToBase64String(encryptedData);
 
כעת לאחר שהצד השני שלח לנו את הסטרינג המוצפן, נשתמש במפתח הפרטי לפענח את ההודעה :
ניצור אובייקט הצפנה חדש ונאתחל אותו עם המפתח הפרטי שלנו:
 
 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider ();
rsa.FromXmlString(privateKey);
 
נהפוך את המידע המוצפן שקיבלנו למערך בתים:
 
 byte[] encryptedData = Convert.FromBase64String(encryptedString);
 
נבצע את הפיענוח:
 
byte[] clearData = rsa.Decrypt(encryptedData, false);
ונהפוך לטקסט קריא:
string clearText = Encoding.UTF8.GetString(clearData);
זהו... די פשוט
 
 
 

להורדת קבצי מקור ופרוייקט

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Posted by talgiladi on 11/1/2009 12:28 PM | Comments (0)

It starts with a random question, but continues with a well designed pattern...

 

static void Main(string[] args)

        {

 

            string source = null;

            while (true)

            {

                if (source == null)

                {

                    source = GetTheQuestionThatMostInterestsMeNow();

                }

                Console.WriteLine("Why " + source + "?");

                var answer = Console.ReadLine();

                var nextQuestion = ThinkDeeplyAboutTheAnswerAndGetTheNextQuestion(answer);

                source = nextQuestion ?? source;

            }

        }

 

        private static string GetTheQuestionThatMostInterestsMeNow()

        {

            return "are the birds singing";

        }

 

        private static string ThinkDeeplyAboutTheAnswerAndGetTheNextQuestion(string answer)

        {

            string result = null;

            if (answer != null)

            {

                int index;

                if ((index = answer.IndexOf("because", StringComparison.OrdinalIgnoreCase)) > -1)

                {

                    answer = answer.Substring(index + "because".Length);

                }

                result = answer;

            }

            return result;

        }

 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Posted by talgiladi on 6/28/2009 12:07 PM | Comments (0)

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

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

היום כשאני מקבל ערך לאיזה מאפיין במחלקה שלי, אני בודק האם הערך תקין, האם הוא לא ריק וכו’, ואם הערכים לא מתאימים לי, אני זורק

הודעת שגיאה בדרך כלל:

  private int _age;

        public int Age

        {

            get

            {

                return _age;

            }

            set

            {

                if (value < 0)

                {

                    throw new ArgumentException("Age must be a positive value");

                }

                _age = value;

            }

        }

ואיך נכתוב את זה באמצעות חוזה?

 private int _age;

        public int Age

        {

            get

            {

                return _age;

            }

            set

            {

                Contract.Requires(value > 0);

                _age = value;

            }

        }

זהו…

הקוד עדיין בתהליכי פיתוח במייקרוסופט, אך הוא מופץ כבר משולב בתוך דוט נט גירסה 4, וניתן להורדה גם עבור ויז’ואל סטודיו 2008.

אז מה יש לנו שם עוד?

יש כמה דברים מעניינים, לדוגמה:

  • בדיקה של הערכים שפונקציה יכולה להחזיר, לפני שהיא מחזירה אותם. בדיקה
  • סטטית(compile time) של קריאות עם ערכים לא תקינים לפונקציה כך שאנו מקבלים אזהרה עוד לפני זמן הריצה (רק שבינתיים הם הוסיפו את האופציה הזאת רק עבור גירסה team suite…)
  • הגדרת דרישות עבור ממשק, כך שכל מחלקה שמיישמת אותו תצטרך למלא את הדרישות האלו.

אבל הדברים העיקריים הם אלו:

  1. תנאי מקדים- שאנו מבטאים באמצעות הקוד שעכשיו כתבנו : Contract.Requires, שבעצם בודק שהכל תקין לפני שאני מתחיל את המתודה שלי.
  2. תנאי מאוחר – שבודק את התקינות לאחר שהקוד שלי רץ והמתודה עומדת להסתיים.
  3. תנאים לא תלויי אובייקט- אלו תנאים שתמיד אמורים להיות נכונים לגבי האובייקט שלי, לא משנה מה מצבו- גיל לא יכול להיות שלילי, גם אם הלקוח לא מילא את פרטי גילו, ולכן בכל מצב זה אמור להיות נכון, ולא רק לאחר שהכנסתי ערך לפרטי הגיל.

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

אם אתם משתמשים בויז’ואל סטודיו 2010 לכו למאפייני הפרוייקט ( לחצן ימני על שם הפרוייקט-> מאפיינים)

defineSymbol

תוסיפו שם את המילה CONTRACTS_FULL

בויז’ואל סטודיו 2008 נדרשת התקנה של הקוד, ולאחר מכן יש להוסיף הפניה ל microsoft.contracts, אך לאחר ההתקנה יהיה לכם בהגדרות פרוייקט טאב מיוחד להגדרות של החוזים.

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

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , | Categories: IOC Posted by talgiladi on 3/4/2009 9:46 PM | Comments (0)

ראיתי את הפרוייקט הזה ב code plex שמיקל על השימוש בService Locator בצורה יותר Loosley Coupled. לאחר מה שקרה לי

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

מחלקות יצרתי שם עם כמה שורות קוד…

בכל מקרה, עדיין הפרוייקט שלהם טעון שיפור, שכן הוא לא מספק דרך לקנפג את השירות דרך הקוד. הם פשוט סומכים על כל מחלקה שמממשת את הממשק שתקנפג את עצמה, שזה די טוב לרוב האנשים שמשתמשים בקבצי XML חיצוניים לקינפוג, אבל אני טוען את המידע בעצמי ואז בזמן ריצה מקנפג את המיפוי, וזה אומר שאני אצטרך בכל מחלקה שמממשת את הממשק אני אצטרך להכניס מעל 100 שורות עם המיפויים, וכולנו יודעים מה זה אומר לשכפל קוד…

אז רק כדי להשלים את הפרוייקט שלהם נראה שצריך להוסיף 2 מתודות בממשק.  הראשונה:

 void RegisterType<TFrom, TTo>() where TTo : TFrom;

זאת שאמורה למפות ממשק למחלקה הדיפולטית שמיישמת אותו, והשניה:

void RegisterInstance<TType>(TType instance);

שתמפה אינסטס קיים של אובייקט שמממש את הממשק.

עכשיו אני יכול בנקודת הכניסה לאפליקציה (נניח ב global.asax) למפות את כל מה שאני רוצה בלי להיות תלוי במימוש מסוים.

Technorati Tags: ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5