אינטרנט ישראל
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
ראשי » פיתוח אינטרנט » פיתוח ב-JavaScript » מספרים רנדומליים בג'אווהסקריפט

מספרים רנדומליים בג'אווהסקריפט

רן בר-זיק מאי 9, 2021 7:04 am תגובה אחת

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

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

באופן עקרוני רנדומליות (ובשפת הקודש: אקראיות) היא דבר שקצת זר באלגוריתמים. כשאנו כותבים פונקציה או אלגוריתם אנו מצפים שהפלט יהיה זהה לאותו קלט. כלומר פונקציה דטרמניסטית. אותו קלט? אותו פלט. אבל לפעמים אנחנו כן צריכים אקראיות. לפעמים זה משהו חסר משמעות כמו למשל משהו שקשור ל-UI – כמו הדמיה של טיפות גשם או משחקים. במקרה הזה כל מתכנת שמכיר מספיק ג'אווהסקריפט ידע ש: Math.random יתן מספר רנדומלי.

const randomNumber = Math.random();
console.log(randomNumber);

המספר שניתן הוא שבר ועכשיו אפשר להכפיל ולעגל אותו בהתאם לצורך. למשל, אם אני רוצה מספר בין 1 ל-100. אני אכפיל ב-100 ואעגל למעלה.

const randomNumber = Math.ceil((Math.random() * 100));
console.log(randomNumber);

אבל לפעמים אנו צריכים מספר רנדומלי לא לצרכי משחקים ושעשועים אלא לצרכים יותר רציניים. כמו למשל צרכים קריפטוגרפיים. איזה צרכים? למשל client nonce אם אנו בסביבת צד לקוח או צרכים אחרים אם אנחנו בסביבת Node.js. אני לא אכתוב כרגע על סביבת שרת אלא על סביבת לקוח.

כשאנחנו צריכים מספר רנדומלי לצרכים האלו אנו לא משתמשים ב-Math.random. בדיוק כמו שלא משתמשים במפתח של חביתוש בלי רשות של רגע ודודלי. למה? כי האקראיות הזו היא לא אקראיות אמיתית. אני אנסה להסביר, אבל למי שאין כוח לקצת תיאוריה יכול לדלג ל" "ובת'כלס".

ג'אווהסקריפט בנויה לפי התקן של ECMAScript. והתקן די כללי בנוגע לאקראיות הזו ובגדול קובע שמי שאחראי לרנדומליות זה הדפדפן. בעבר המנועים של הדפדפנים מימשו את האקראיות בכל מיני דרכים. לפני כמה שנים, ב-2015, רוב הדפדפנים התפקסו על שימוש באלגוריתם שנקרא Xorshift128. מדובר באלגוריתם שהוא לא רנדומלי אלא מדמה רנדומליות. בשפה של הקריפטוגרפים זה אלגוריתם מסוג PRNG שזה ראשי תבות של pseudo random number generator. מה זה אומר? שמדובר באלגוריתם שמייצר רנדומליות אבל יש כמה בעיות ברנדומליות הזו, מבלי להכנס לענייני קריפטגורפיה – זה אומר שבתנאים מסוימים אפשר לנחש את המספרים הרנדומליים האלו. כי הם לא מספיק רנדומליים. בדיוק בשביל זה אנחנו צריכים להשתמש באלגוריתמים מסוג CSPRNG שזה ראשי תבות של Cryptographically-secure pseudorandom number generator. שזה אומר אלגוריתמים שנותנים אקראיות שמספיקה לשימושים קריפטוגרפיים שדורשים מספרים רנדומליים. Math.random הוא מהסוג הראשון והוא לא טוב לצרכים קריפטוגרפיים כמו nonce או כל צורך אחר שקשור לצרכי הצפנה או אבטחת מידע. אם אתם נדרשים על ידי השרת לספק איזשהו מפתח רנדומלי, אתם צריכים להשתמש ב-CSPRNG ואת זה מקבלים במקום אחר.

ובת'כלס?

בת'כלס בכל פעם שאתם נדרשים למספר רנדומלי לצרכי אבטחה בצד הלקוח – כדאי להשתמש בספרית web crypto. וספציפית ב-Crypto.getRandomValues – פונקציה שמחזירה ערכים רנדומליים שבטוחים לשימוש קריפטוגרפית. לא ליצירת מפתחות אבל בכל פעם שנדרש ערך רנדומלי – ואם אתם מפתחי צד לקוח – ברגע שמבקשים מכם nonce עבור השרת מסיבה מסוימת – אתם צריכים להשתמש ב-Crypto.getRandomValues.

הפונקציה עובדת בצורה מעט שונה. היא מקבלת TypedArray (שזה מערך מסוג מסוים) ומאכלסת אותו במספרים רנדומליים. למשל – כאן אני יוצר מערך מסוג Uint32Array באורך של איבר אחד ומאכלס אותו:

const randomNumbersArray = new Uint32Array(1);

globalThis.crypto.getRandomValues(randomNumbersArray);

console.log(randomNumbersArray[0]);

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

const randomNumbersArray = new Uint8Array(1);

globalThis.crypto.getRandomValues(randomNumbersArray);

console.log(randomNumbersArray[0]);

אם typedArray הוא מוזר וחדש עבורכם, אז אולי כדאי לקרוא עליו ב-MDN. אבל בגדול זה מערך שיכול להכנס אליו נתונים מסוג מסוים של מספרים. אם globalThis הוא חדש לכם – אז כאן כתבתי עליו כמה מילים.

אבל ככה מייצרים קוד טוב שמייצר אקראיות מספיק טובה לשימושים קריפטגורפיים שנדרשים בצד הלקוח. שימוש ב-API שנועד לצרכים קריפטוגרפיים כאשר יש צורך כזה מבטיח שהקוד שלכם יישאר עמיד. כי גם אם (למשל), יחליפו את האלגוריתם מאחורי getRandomValues – הקוד שלכם ימשיך לעבוד ויהיה מספיק בטוח. אז אני ממליץ מאוד להשתמש בו ובכלל להכיר את crypto בצד הלקוח 🙂

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.
אבטחת מידע ג'אווהסקריפט

תגובה אחת

  1. chv הגב מאי 9, 2021 בשעה 1:08 pm

    לכתבה קצת יותר תיאורטית אפשר לעיין גם כאן
    https://blog.chv.ovh/true-random/

השארת תגובה

ביטול

ללמוד ג'אווהסקריפט בעברית

ללמוד לתכנת ג'אווהסקריפט בעברית שגייס יותר משלוש מאות אלף שקל ולמעלה מ-2000 תומכים - בואו ללמוד עכשיו איך לתכנת.

רשימת הנושאים
  • מדריכים
    • ריאקט
    • טייפסקריפט
    • ECMAScript 6
    • ES20XX
    • Node.js
    • Express
    • רספברי פיי
    • Babel
    • docker
    • MongoDB
    • Git
    • לימוד MySQL
    • SASS
    • jQuery
    • CSS3
    • HTML 5
    • SVN
    • LESS
  • פיתוח אינטרנט
    • פתרונות ומאמרים על פיתוח אינטרנט
    • jQuery Scripts
    • jQuery למתקדמים
    • יסודות בתכנות
    • נגישות אינטרנט
  • חדשות אינטרנט
  • מידע כללי על אינטרנט
    • רשת האינטרנט
    • בניית אתרי אינטרנט
  • rss logo

    לכל המאמרים

    לכל המאמרים שפורסמו באינטרנט ישראל משנת 2008 ועד עכשיו.
  • rss logo

    RSS Feed

    משתמשים בקורא RSS? אם כן, עקבו אחרי אינטרנט ישראל באמצעות פיד ה-RSS!
    מה זה RSS?
  • Twitter logo

    עקבו אחרי בטוויטר

    בחשבון הטוויטר שלי אני מפרסם עדכונים מהירים על חדשות בתחום התכנות והיזמות, התרעות על מצבי חירום ורכילות בוערת על תחום הווב.
    מה זה טוויטר?
  • facebook like image

    ערוץ הטלגרם של אינטרנט ישראל

    בערוץ הטלגרם של אינטרנט ישראל אני מפרסם את הפוסטים של באתר וכן עדכונים טכנולוגיים נוספים.
    מה זה טלגרם?
  • github logo

    הפרויקטים שלי בגיטהאב

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

כל הזכויות שמורות לרן בר-זיק ולאינטרנט ישראל | מדיניות הפרטיות של אתר אינטרנט ישראל | אתר אינטרנט ישראל נגיש לפי תקן WCAG 2.0 AA | הצהרת הנגישות של האתר | אבטחת מידע ודיווח על בעיית אבטחת מידע

גלילה לראש העמוד