מחלקת Java SecureRandom

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הקדמה

במדריך קצר זה נלמד על java.security.SecureRandom, מחלקה המספקת מחולל מספרים אקראיים חזק בהצפנה.

2. השוואה ל java.util.Random

יישומי JDK סטנדרטיים של java.util.Random השתמש באלגוריתם Generator Congruential Generator (LCG) לספק מספרים אקראיים. הבעיה באלגוריתם הזה היא שהוא לא חזק בהצפנה. במילים אחרות, הערכים הנוצרים צפויים הרבה יותר, ולכן התוקפים יכולים להשתמש בהם בכדי לפגוע במערכת שלנו.

כדי להתגבר על נושא זה, עלינו לעשות זאת להשתמש java.security.SecureRandom בכל החלטות ביטחוניות. הוא מייצר ערכים אקראיים חזקים מבחינה קריפטוגרפית באמצעות a מחולל מספרים פסאודו-אקראי חזק מבחינה קריפטוגרפית (CSPRNG).

להבנה טובה יותר של ההבדל בין LCG ו- CSPRNG, אנא עיין בתרשים שלהלן המציג התפלגות ערכים עבור שני האלגוריתמים:

3. יצירת ערכים אקראיים

דרך השימוש הנפוצה ביותר SecureRandom הוא ל לִיצוֹר int, ארוך, לָצוּף, לְהַכפִּיל אוֹ בוליאני ערכים:

int randomInt = secureRandom.nextInt (); ארוך randomLong = secureRandom.nextLong (); float randomFloat = secureRandom.nextFloat (); כפול randomDouble = secureRandom.nextDouble (); בוליאני randomBoolean = secureRandom.nextBoolean ();

להפקת int ערכים שנוכל להעביר גבול עליון כפרמטר:

int randomInt = secureRandom.nextInt (upperBound);

בנוסף, אנחנו יכולים לייצר זרם ערכים ל int,לְהַכפִּיל ו ארוך:

IntStream randomIntStream = secureRandom.ints (); LongStream randomLongStream = secureRandom.longs (); DoubleStream randomDoubleStream = secureRandom.doubles ();

עבור כל הזרמים אנו יכולים להגדיר במפורש את גודל הזרם:

IntStream intStream = secureRandom.ints (streamSize);

וערכי המקור (כולל) והמאוגדים (הבלעדיים) גם כן:

IntStream intStream = secureRandom.ints (streamSize, originValue, boundValue);

אנחנו יכולים גם ליצור רצף בתים אקראיים. ה nextBytes () הפונקציה לוקחת את המשתמש המסופק בתים מערך וממלא אותו באקראי בתיםs:

בתים [] ערכים = בתים חדשים [124]; secureRandom.nextBytes (ערכים);

4. בחירת אלגוריתם

כברירת מחדל, SecureRandom משתמש באלגוריתם SHA1PRNG כדי ליצור ערכים אקראיים. אנו יכולים לגרום לכך במפורש להשתמש באלגוריתם אחר על ידי הפעלת ה- getInstance () שיטה:

SecureRandom secureRandom = SecureRandom.getInstance ("NativePRNG");

יוצר SecureRandom עם ה חָדָשׁ מפעיל שווה ערך ל- SecureRandom.getInstance ("SHA1PRNG").

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

5. זרעים

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

משתמש ב חָדָשׁ מפעיל או מתקשר SecureRandom.getInstance () יקבל את זרע ברירת המחדל מ / dev / urandom.

אנו יכולים לשנות את הזרע על ידי העברתו כפרמטר קונסטרוקטור:

בייט [] seed = getSecureRandomSeed (); SecureRandom secureRandom = SecureRandom חדש (זרע);

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

בייט [] seed = getSecureRandomSeed (); secureRandom.setSeed (זרע);

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

6. מסקנה

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

כמו תמיד, כל הקוד המוצג במדריך זה ניתן למצוא באתר GitHub.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found