رده OWASP: MASVS-CRYPTO: رمزنگاری
نمای کلی
مولد اعداد شبهتصادفی (PRNG) الگوریتمی است که توالیهای عددی قابل پیشبینی را بر اساس یک مقدار اولیه به نام « بذر» (seed) تولید میکند. یک توالی عددی تولید شده توسط PRNG تقریباً همان ویژگیهای یک توالی عددی واقعاً تصادفی را دارد، اما سریعتر و از نظر محاسباتی کمهزینهتر است.
به عبارت دیگر، PRNGها از نظر یکنواختی توزیع آنتروپی، که توالیهای اعداد واقعاً تصادفی را شبیهسازی میکنند، نسبت به RNGهای ضعیف (مثلاً java.math.Random ) اطمینان بیشتری دارند. تولید اعداد واقعاً تصادفی نیاز به تجهیزات تخصصی دارد و اغلب خارج از محدوده توسعه عادی است. این سند تولید اعداد واقعاً تصادفی را پوشش نمیدهد و فقط بر PRNGها تمرکز دارد زیرا آنها روش استاندارد مورد استفاده هستند.
آسیبپذیریهای PRNG ضعیف زمانی رخ میدهند که توسعهدهندگان از یک PRNG معمولی برای اهداف رمزنگاری، به جای یک PRNG امن رمزنگاریشده (CSPRNG) استفاده میکنند. CSPRNGها الزامات سختگیرانهتری دارند و وقتی سید ناشناخته باشد، باید به مهاجم تنها یک مزیت ناچیز در تمایز یک توالی خروجی از یک توالی تصادفی واقعی بدهند.
مهاجمان همچنین ممکن است بتوانند توالی اعداد تولید شده را حدس بزنند، زمانی که از سیدهای قابل پیشبینی - مانند سیدهایی که توسط توسعهدهنده کدگذاری شدهاند - برای مقداردهی اولیه PRNG یا CSPRNG استفاده میشود، زیرا مهاجم میتواند سید را حدس بزند و بنابراین خروجی تولید شده توسط PRNG را پیشبینی کند.
تأثیر
اگر یک PRNG غیر رمزنگاریشده امن در یک زمینه امنیتی مانند احراز هویت استفاده شود، یک مهاجم ممکن است بتواند اعداد تصادفی تولید شده را حدس بزند و به دادهها یا ویژگیهای ممتاز دسترسی پیدا کند.
کاهشها
عمومی
- وقتی پیامدهای امنیتی وجود دارد،
java.security.SecureRandomاستفاده کنید - برای موارد دیگر
java.util.Randomاستفاده کنید - هرگز از
Math.randomاستفاده نکنید!
جاوا.امنیتی.SecureRandom
برای کاربردهای امنیتی توصیه میشود . در اندروید، SecureRandom.getInstanceStrong() معادل دریافت SHA1PRNG از AndroidOpenSSL است. این تابع به پیادهسازی blocking /dev/random نگاشت نمیشود. برای استفاده از آن، getInstanceStrong() را فراخوانی کنید:
کاتلین
val rand = SecureRandom.getInstanceStrong()
جاوا
SecureRandom rand = SecureRandom.getInstanceStrong();
در غیر این صورت، در نسخههای هسته لینوکس قبل از ۵.۱۷، وقتی مسدود کردن نخ هنگام تولید اعداد تصادفی غیرقابل قبول است، سازنده SecureRandom باید مستقیماً فراخوانی شود:
کاتلین
import java.security.SecureRandom
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = SecureRandom()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
// Use rand_int for security & authentication
}
}
جاوا
import java.security.SecureRandom;
public class generateRandom {
public static void main(String args[])
{
// Create instance of SecureRandom class
SecureRandom rand = new SecureRandom();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
// Use rand_int for security & authentication
}
}
SecureRandom مقدار اولیه پیشفرض را از /dev/urandom دریافت میکند و هنگام ساخت یا دریافت شیء به طور خودکار استفاده میشود، بنابراین نیازی به تعیین مقدار اولیه PRNG نیست. به طور کلی، هرگونه استفاده قطعی از SecureRandom توصیه نمیشود (به خصوص اگر این امر منجر به کدگذاری سخت یک مقدار اولیه شود که هر کسی که برنامه را دیکامپایل میکند میتواند آن را ببیند). توسعهدهندگانی که میخواهند خروجی شبهتصادفی قابل تکرار تولید کنند، باید از مقادیر اولیه مناسبتری مانند HMAC، HKDF و SHAKE استفاده کنند.
java.util.Random
برای اهداف امنیتی/احراز هویت از آن اجتناب کنید ، استفاده از آن برای هر چیز دیگری قابل قبول است.
کاتلین
import java.util.Random
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = Random()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
}
}
جاوا
import java.util.Random;
public class generateRandom {
public static void main(String args[])
{
// Create instance of Random class
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
}
}
منابع
- جاوا.امنیتی.SecureRandom
- java.util.Random
- ریاضی.تصادفی
- CWE قابل پیشبینی Seed
- CWE PRNG با رمزنگاری ضعیف
- جاوا امن تصادفی
- جاوا تصادفی در مقابل امن تصادفی
- نحوه استفاده از SecureRandom
- راهنمای امنیت PRNG پایتون
- برگه تقلب ذخیرهسازی رمزنگاری OWASP
- CVE-2013-6386: vuln ضعیف PRNG در دروپال
- CVE-2006-3419: vuln ضعیف PRNG در Tor
- CVE-2008-4102: سید قابل پیشبینی در جوملا
- وصله تصادفی هسته لینوکس
رده OWASP: MASVS-CRYPTO: رمزنگاری
نمای کلی
مولد اعداد شبهتصادفی (PRNG) الگوریتمی است که توالیهای عددی قابل پیشبینی را بر اساس یک مقدار اولیه به نام « بذر» (seed) تولید میکند. یک توالی عددی تولید شده توسط PRNG تقریباً همان ویژگیهای یک توالی عددی واقعاً تصادفی را دارد، اما سریعتر و از نظر محاسباتی کمهزینهتر است.
به عبارت دیگر، PRNGها از نظر یکنواختی توزیع آنتروپی، که توالیهای اعداد واقعاً تصادفی را شبیهسازی میکنند، نسبت به RNGهای ضعیف (مثلاً java.math.Random ) اطمینان بیشتری دارند. تولید اعداد واقعاً تصادفی نیاز به تجهیزات تخصصی دارد و اغلب خارج از محدوده توسعه عادی است. این سند تولید اعداد واقعاً تصادفی را پوشش نمیدهد و فقط بر PRNGها تمرکز دارد زیرا آنها روش استاندارد مورد استفاده هستند.
آسیبپذیریهای PRNG ضعیف زمانی رخ میدهند که توسعهدهندگان از یک PRNG معمولی برای اهداف رمزنگاری، به جای یک PRNG امن رمزنگاریشده (CSPRNG) استفاده میکنند. CSPRNGها الزامات سختگیرانهتری دارند و وقتی سید ناشناخته باشد، باید به مهاجم تنها یک مزیت ناچیز در تمایز یک توالی خروجی از یک توالی تصادفی واقعی بدهند.
مهاجمان همچنین ممکن است بتوانند توالی اعداد تولید شده را حدس بزنند، زمانی که از سیدهای قابل پیشبینی - مانند سیدهایی که توسط توسعهدهنده کدگذاری شدهاند - برای مقداردهی اولیه PRNG یا CSPRNG استفاده میشود، زیرا مهاجم میتواند سید را حدس بزند و بنابراین خروجی تولید شده توسط PRNG را پیشبینی کند.
تأثیر
اگر یک PRNG غیر رمزنگاریشده امن در یک زمینه امنیتی مانند احراز هویت استفاده شود، یک مهاجم ممکن است بتواند اعداد تصادفی تولید شده را حدس بزند و به دادهها یا ویژگیهای ممتاز دسترسی پیدا کند.
کاهشها
عمومی
- وقتی پیامدهای امنیتی وجود دارد،
java.security.SecureRandomاستفاده کنید - برای موارد دیگر
java.util.Randomاستفاده کنید - هرگز از
Math.randomاستفاده نکنید!
جاوا.امنیتی.SecureRandom
برای کاربردهای امنیتی توصیه میشود . در اندروید، SecureRandom.getInstanceStrong() معادل دریافت SHA1PRNG از AndroidOpenSSL است. این تابع به پیادهسازی blocking /dev/random نگاشت نمیشود. برای استفاده از آن، getInstanceStrong() را فراخوانی کنید:
کاتلین
val rand = SecureRandom.getInstanceStrong()
جاوا
SecureRandom rand = SecureRandom.getInstanceStrong();
در غیر این صورت، در نسخههای هسته لینوکس قبل از ۵.۱۷، وقتی مسدود کردن نخ هنگام تولید اعداد تصادفی غیرقابل قبول است، سازنده SecureRandom باید مستقیماً فراخوانی شود:
کاتلین
import java.security.SecureRandom
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = SecureRandom()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
// Use rand_int for security & authentication
}
}
جاوا
import java.security.SecureRandom;
public class generateRandom {
public static void main(String args[])
{
// Create instance of SecureRandom class
SecureRandom rand = new SecureRandom();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
// Use rand_int for security & authentication
}
}
SecureRandom مقدار اولیه پیشفرض را از /dev/urandom دریافت میکند و هنگام ساخت یا دریافت شیء به طور خودکار استفاده میشود، بنابراین نیازی به تعیین مقدار اولیه PRNG نیست. به طور کلی، هرگونه استفاده قطعی از SecureRandom توصیه نمیشود (به خصوص اگر این امر منجر به کدگذاری سخت یک مقدار اولیه شود که هر کسی که برنامه را دیکامپایل میکند میتواند آن را ببیند). توسعهدهندگانی که میخواهند خروجی شبهتصادفی قابل تکرار تولید کنند، باید از مقادیر اولیه مناسبتری مانند HMAC، HKDF و SHAKE استفاده کنند.
java.util.Random
برای اهداف امنیتی/احراز هویت از آن اجتناب کنید ، استفاده از آن برای هر چیز دیگری قابل قبول است.
کاتلین
import java.util.Random
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = Random()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
}
}
جاوا
import java.util.Random;
public class generateRandom {
public static void main(String args[])
{
// Create instance of Random class
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
}
}
منابع
- جاوا.امنیتی.SecureRandom
- java.util.Random
- ریاضی.تصادفی
- CWE قابل پیشبینی Seed
- CWE PRNG با رمزنگاری ضعیف
- جاوا امن تصادفی
- جاوا تصادفی در مقابل امن تصادفی
- نحوه استفاده از SecureRandom
- راهنمای امنیت PRNG پایتون
- برگه تقلب ذخیرهسازی رمزنگاری OWASP
- CVE-2013-6386: vuln ضعیف PRNG در دروپال
- CVE-2006-3419: vuln ضعیف PRNG در Tor
- CVE-2008-4102: سید قابل پیشبینی در جوملا
- وصله تصادفی هسته لینوکس
رده OWASP: MASVS-CRYPTO: رمزنگاری
نمای کلی
مولد اعداد شبهتصادفی (PRNG) الگوریتمی است که توالیهای عددی قابل پیشبینی را بر اساس یک مقدار اولیه به نام « بذر» (seed) تولید میکند. یک توالی عددی تولید شده توسط PRNG تقریباً همان ویژگیهای یک توالی عددی واقعاً تصادفی را دارد، اما سریعتر و از نظر محاسباتی کمهزینهتر است.
به عبارت دیگر، PRNGها از نظر یکنواختی توزیع آنتروپی، که توالیهای اعداد واقعاً تصادفی را شبیهسازی میکنند، نسبت به RNGهای ضعیف (مثلاً java.math.Random ) اطمینان بیشتری دارند. تولید اعداد واقعاً تصادفی نیاز به تجهیزات تخصصی دارد و اغلب خارج از محدوده توسعه عادی است. این سند تولید اعداد واقعاً تصادفی را پوشش نمیدهد و فقط بر PRNGها تمرکز دارد زیرا آنها روش استاندارد مورد استفاده هستند.
آسیبپذیریهای PRNG ضعیف زمانی رخ میدهند که توسعهدهندگان از یک PRNG معمولی برای اهداف رمزنگاری، به جای یک PRNG امن رمزنگاریشده (CSPRNG) استفاده میکنند. CSPRNGها الزامات سختگیرانهتری دارند و وقتی سید ناشناخته باشد، باید به مهاجم تنها یک مزیت ناچیز در تمایز یک توالی خروجی از یک توالی تصادفی واقعی بدهند.
مهاجمان همچنین ممکن است بتوانند توالی اعداد تولید شده را حدس بزنند، زمانی که از سیدهای قابل پیشبینی - مانند سیدهایی که توسط توسعهدهنده کدگذاری شدهاند - برای مقداردهی اولیه PRNG یا CSPRNG استفاده میشود، زیرا مهاجم میتواند سید را حدس بزند و بنابراین خروجی تولید شده توسط PRNG را پیشبینی کند.
تأثیر
اگر یک PRNG غیر رمزنگاریشده امن در یک زمینه امنیتی مانند احراز هویت استفاده شود، یک مهاجم ممکن است بتواند اعداد تصادفی تولید شده را حدس بزند و به دادهها یا ویژگیهای ممتاز دسترسی پیدا کند.
کاهشها
عمومی
- وقتی پیامدهای امنیتی وجود دارد،
java.security.SecureRandomاستفاده کنید - برای موارد دیگر
java.util.Randomاستفاده کنید - هرگز از
Math.randomاستفاده نکنید!
جاوا.امنیتی.SecureRandom
برای کاربردهای امنیتی توصیه میشود . در اندروید، SecureRandom.getInstanceStrong() معادل دریافت SHA1PRNG از AndroidOpenSSL است. این تابع به پیادهسازی blocking /dev/random نگاشت نمیشود. برای استفاده از آن، getInstanceStrong() را فراخوانی کنید:
کاتلین
val rand = SecureRandom.getInstanceStrong()
جاوا
SecureRandom rand = SecureRandom.getInstanceStrong();
در غیر این صورت، در نسخههای هسته لینوکس قبل از ۵.۱۷، وقتی مسدود کردن نخ هنگام تولید اعداد تصادفی غیرقابل قبول است، سازنده SecureRandom باید مستقیماً فراخوانی شود:
کاتلین
import java.security.SecureRandom
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = SecureRandom()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
// Use rand_int for security & authentication
}
}
جاوا
import java.security.SecureRandom;
public class generateRandom {
public static void main(String args[])
{
// Create instance of SecureRandom class
SecureRandom rand = new SecureRandom();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
// Use rand_int for security & authentication
}
}
SecureRandom مقدار اولیه پیشفرض را از /dev/urandom دریافت میکند و هنگام ساخت یا دریافت شیء به طور خودکار استفاده میشود، بنابراین نیازی به تعیین مقدار اولیه PRNG نیست. به طور کلی، هرگونه استفاده قطعی از SecureRandom توصیه نمیشود (به خصوص اگر این امر منجر به کدگذاری سخت یک مقدار اولیه شود که هر کسی که برنامه را دیکامپایل میکند میتواند آن را ببیند). توسعهدهندگانی که میخواهند خروجی شبهتصادفی قابل تکرار تولید کنند، باید از مقادیر اولیه مناسبتری مانند HMAC، HKDF و SHAKE استفاده کنند.
java.util.Random
برای اهداف امنیتی/احراز هویت از آن اجتناب کنید ، استفاده از آن برای هر چیز دیگری قابل قبول است.
کاتلین
import java.util.Random
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = Random()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
}
}
جاوا
import java.util.Random;
public class generateRandom {
public static void main(String args[])
{
// Create instance of Random class
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
}
}
منابع
- جاوا.امنیتی.SecureRandom
- java.util.Random
- ریاضی.تصادفی
- CWE قابل پیشبینی Seed
- CWE PRNG با رمزنگاری ضعیف
- جاوا امن تصادفی
- جاوا تصادفی در مقابل امن تصادفی
- نحوه استفاده از SecureRandom
- راهنمای امنیت PRNG پایتون
- برگه تقلب ذخیرهسازی رمزنگاری OWASP
- CVE-2013-6386: vuln ضعیف PRNG در دروپال
- CVE-2006-3419: vuln ضعیف PRNG در Tor
- CVE-2008-4102: سید قابل پیشبینی در جوملا
- وصله تصادفی هسته لینوکس
رده OWASP: MASVS-CRYPTO: رمزنگاری
نمای کلی
مولد اعداد شبهتصادفی (PRNG) الگوریتمی است که توالیهای عددی قابل پیشبینی را بر اساس یک مقدار اولیه به نام « بذر» (seed) تولید میکند. یک توالی عددی تولید شده توسط PRNG تقریباً همان ویژگیهای یک توالی عددی واقعاً تصادفی را دارد، اما سریعتر و از نظر محاسباتی کمهزینهتر است.
به عبارت دیگر، PRNGها از نظر یکنواختی توزیع آنتروپی، که توالیهای اعداد واقعاً تصادفی را شبیهسازی میکنند، نسبت به RNGهای ضعیف (مثلاً java.math.Random ) اطمینان بیشتری دارند. تولید اعداد واقعاً تصادفی نیاز به تجهیزات تخصصی دارد و اغلب خارج از محدوده توسعه عادی است. این سند تولید اعداد واقعاً تصادفی را پوشش نمیدهد و فقط بر PRNGها تمرکز دارد زیرا آنها روش استاندارد مورد استفاده هستند.
آسیبپذیریهای PRNG ضعیف زمانی رخ میدهند که توسعهدهندگان از یک PRNG معمولی برای اهداف رمزنگاری، به جای یک PRNG امن رمزنگاریشده (CSPRNG) استفاده میکنند. CSPRNGها الزامات سختگیرانهتری دارند و وقتی سید ناشناخته باشد، باید به مهاجم تنها یک مزیت ناچیز در تمایز یک توالی خروجی از یک توالی تصادفی واقعی بدهند.
مهاجمان همچنین ممکن است بتوانند توالی اعداد تولید شده را حدس بزنند، زمانی که از سیدهای قابل پیشبینی - مانند سیدهایی که توسط توسعهدهنده کدگذاری شدهاند - برای مقداردهی اولیه PRNG یا CSPRNG استفاده میشود، زیرا مهاجم میتواند سید را حدس بزند و بنابراین خروجی تولید شده توسط PRNG را پیشبینی کند.
تأثیر
اگر یک PRNG غیر رمزنگاریشده امن در یک زمینه امنیتی مانند احراز هویت استفاده شود، یک مهاجم ممکن است بتواند اعداد تصادفی تولید شده را حدس بزند و به دادهها یا ویژگیهای ممتاز دسترسی پیدا کند.
کاهشها
عمومی
- وقتی پیامدهای امنیتی وجود دارد،
java.security.SecureRandomاستفاده کنید - برای موارد دیگر
java.util.Randomاستفاده کنید - هرگز از
Math.randomاستفاده نکنید!
جاوا.امنیتی.SecureRandom
برای کاربردهای امنیتی توصیه میشود . در اندروید، SecureRandom.getInstanceStrong() معادل دریافت SHA1PRNG از AndroidOpenSSL است. این تابع به پیادهسازی blocking /dev/random نگاشت نمیشود. برای استفاده از آن، getInstanceStrong() را فراخوانی کنید:
کاتلین
val rand = SecureRandom.getInstanceStrong()
جاوا
SecureRandom rand = SecureRandom.getInstanceStrong();
در غیر این صورت، در نسخههای هسته لینوکس قبل از ۵.۱۷، وقتی مسدود کردن نخ هنگام تولید اعداد تصادفی غیرقابل قبول است، سازنده SecureRandom باید مستقیماً فراخوانی شود:
کاتلین
import java.security.SecureRandom
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = SecureRandom()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
// Use rand_int for security & authentication
}
}
جاوا
import java.security.SecureRandom;
public class generateRandom {
public static void main(String args[])
{
// Create instance of SecureRandom class
SecureRandom rand = new SecureRandom();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
// Use rand_int for security & authentication
}
}
SecureRandom مقدار اولیه پیشفرض را از /dev/urandom دریافت میکند و هنگام ساخت یا دریافت شیء به طور خودکار استفاده میشود، بنابراین نیازی به تعیین مقدار اولیه PRNG نیست. به طور کلی، هرگونه استفاده قطعی از SecureRandom توصیه نمیشود (به خصوص اگر این امر منجر به کدگذاری سخت یک مقدار اولیه شود که هر کسی که برنامه را دیکامپایل میکند میتواند آن را ببیند). توسعهدهندگانی که میخواهند خروجی شبهتصادفی قابل تکرار تولید کنند، باید از مقادیر اولیه مناسبتری مانند HMAC، HKDF و SHAKE استفاده کنند.
java.util.Random
برای اهداف امنیتی/احراز هویت از آن اجتناب کنید ، استفاده از آن برای هر چیز دیگری قابل قبول است.
کاتلین
import java.util.Random
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = Random()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
}
}
جاوا
import java.util.Random;
public class generateRandom {
public static void main(String args[])
{
// Create instance of Random class
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
}
}
منابع
- جاوا.امنیتی.SecureRandom
- java.util.Random
- ریاضی.تصادفی
- CWE قابل پیشبینی Seed
- CWE PRNG با رمزنگاری ضعیف
- جاوا امن تصادفی
- جاوا تصادفی در مقابل امن تصادفی
- نحوه استفاده از SecureRandom
- راهنمای امنیت PRNG پایتون
- برگه تقلب ذخیرهسازی رمزنگاری OWASP
- CVE-2013-6386: vuln ضعیف PRNG در دروپال
- CVE-2006-3419: vuln ضعیف PRNG در Tor
- CVE-2008-4102: سید قابل پیشبینی در جوملا
- وصله تصادفی هسته لینوکس