দুর্বল PRNG

OWASP বিভাগ: MASVS-CRYPTO: ক্রিপ্টোগ্রাফি

ওভারভিউ

একটি সিউডোর্যান্ডম নম্বর জেনারেটর (PRNG) হল একটি অ্যালগরিদম যা একটি বীজ নামক প্রারম্ভিক মানের উপর ভিত্তি করে অনুমানযোগ্য সংখ্যা ক্রম তৈরি করে। একটি PRNG-উত্পাদিত সংখ্যা ক্রম একটি সত্যই র্যান্ডম সংখ্যা ক্রম হিসাবে প্রায় একই বৈশিষ্ট্য আছে, কিন্তু তৈরি করা দ্রুত এবং কম গণনামূলকভাবে ব্যয়বহুল।

অন্য কথায়, এনট্রপি ডিস্ট্রিবিউশনের সমানতার ক্ষেত্রে দুর্বল RNGs (যেমন java.math.Random ) থেকে PRNG-এর উচ্চতর নিশ্চয়তা রয়েছে, যা সত্যিকারের র্যান্ডম সংখ্যা ক্রম অনুকরণ করে। সত্যিই র্যান্ডম সংখ্যা তৈরির জন্য বিশেষ সরঞ্জামের প্রয়োজন হয় এবং প্রায়শই স্বাভাবিক বিকাশের সুযোগের বাইরে থাকে। এই নিবন্ধটি সত্যিকার অর্থে র্যান্ডম সংখ্যা তৈরিকে কভার করে না, এবং শুধুমাত্র PRNGs-এর উপর ফোকাস করে কারণ সেগুলি ব্যবহার করা আদর্শ পদ্ধতি।

দুর্বল PRNG দুর্বলতা দেখা দেয় যখন বিকাশকারীরা ক্রিপ্টোগ্রাফিক উদ্দেশ্যে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত PRNG (CSPRNG) এর পরিবর্তে একটি নিয়মিত PRNG ব্যবহার করে। CSPRNG-এর কঠোর প্রয়োজনীয়তা রয়েছে, এবং যখন বীজটি অজানা থাকে, তখন তাদের অবশ্যই একজন আক্রমণকারীকে একটি প্রকৃত র্যান্ডম ক্রম থেকে একটি আউটপুট সিকোয়েন্সকে আলাদা করার ক্ষেত্রে একটি তুচ্ছ সুবিধা দিতে হবে।

আক্রমণকারীরা জেনারেট হওয়া সংখ্যার ক্রম অনুমান করতেও সক্ষম হতে পারে যখন অনুমানযোগ্য বীজ - যেমন বিকাশকারী দ্বারা হার্ডকোড করা - একটি PRNG বা CSPRNG শুরু করতে ব্যবহৃত হয়, কারণ আক্রমণকারী বীজটি অনুমান করতে পারে এবং এইভাবে PRNG দ্বারা উৎপন্ন আউটপুট পূর্বাভাস দিতে পারে।

প্রভাব

যদি একটি নন-ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত PRNG প্রমাণীকরণের মতো নিরাপত্তা প্রসঙ্গে ব্যবহার করা হয়, তাহলে একজন আক্রমণকারী এলোমেলোভাবে তৈরি হওয়া সংখ্যাগুলি অনুমান করতে এবং বিশেষ সুবিধাপ্রাপ্ত ডেটা বা কার্যকারিতায় অ্যাক্সেস পেতে সক্ষম হতে পারে।

প্রশমন

সাধারণ

  • নিরাপত্তার প্রভাব থাকলে java.security.SecureRandom ব্যবহার করুন
  • অন্য কোনো ক্ষেত্রে java.util.Random ব্যবহার করুন
  • কখনই Math.random ব্যবহার করবেন না!

java.security.SecureRandom

নিরাপত্তা ব্যবহারের জন্য প্রস্তাবিত . যদি লিনাক্স কার্নেল সংস্করণ 5.17+ হয় বা থ্রেড ব্লক করা গ্রহণযোগ্য হয়, আপনি র্যান্ডম সংখ্যা তৈরি করার আগে পর্যাপ্ত এনট্রপি জমা হওয়ার জন্য অপেক্ষা করুন (যেমন /dev/random ব্যবহার করুন)। এটি করতে, getInstanceStrong() কল করুন:

কোটলিন জাভা
val rand = SecureRandom.getInstanceStrong()
SecureRandom rand = SecureRandom.getInstanceStrong();

অন্যথায়, লিনাক্স কার্নেল সংস্করণে 5.17-এর আগে যখন র্যান্ডম সংখ্যা তৈরি করার সময় থ্রেড ব্লক করা অগ্রহণযোগ্য, তখন 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);
   
}
}

সম্পদ

,

OWASP বিভাগ: MASVS-CRYPTO: ক্রিপ্টোগ্রাফি

ওভারভিউ

একটি সিউডোর্যান্ডম নম্বর জেনারেটর (PRNG) হল একটি অ্যালগরিদম যা একটি বীজ নামক প্রারম্ভিক মানের উপর ভিত্তি করে অনুমানযোগ্য সংখ্যা ক্রম তৈরি করে। একটি PRNG-উত্পাদিত সংখ্যা ক্রম একটি সত্যই র্যান্ডম সংখ্যা ক্রম হিসাবে প্রায় একই বৈশিষ্ট্য আছে, কিন্তু তৈরি করা দ্রুত এবং কম গণনামূলকভাবে ব্যয়বহুল।

অন্য কথায়, এনট্রপি ডিস্ট্রিবিউশনের সমানতার ক্ষেত্রে দুর্বল RNGs (যেমন java.math.Random ) থেকে PRNG-এর উচ্চতর নিশ্চয়তা রয়েছে, যা সত্যিকারের র্যান্ডম সংখ্যা ক্রম অনুকরণ করে। সত্যিই র্যান্ডম সংখ্যা তৈরির জন্য বিশেষ সরঞ্জামের প্রয়োজন হয় এবং প্রায়শই স্বাভাবিক বিকাশের সুযোগের বাইরে থাকে। এই নিবন্ধটি সত্যিকার অর্থে র্যান্ডম সংখ্যা তৈরিকে কভার করে না, এবং শুধুমাত্র PRNGs-এর উপর ফোকাস করে কারণ সেগুলি ব্যবহার করা আদর্শ পদ্ধতি।

দুর্বল PRNG দুর্বলতা দেখা দেয় যখন বিকাশকারীরা ক্রিপ্টোগ্রাফিক উদ্দেশ্যে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত PRNG (CSPRNG) এর পরিবর্তে একটি নিয়মিত PRNG ব্যবহার করে। CSPRNG-এর কঠোর প্রয়োজনীয়তা রয়েছে, এবং যখন বীজটি অজানা থাকে, তখন তাদের অবশ্যই একজন আক্রমণকারীকে একটি প্রকৃত র্যান্ডম ক্রম থেকে একটি আউটপুট সিকোয়েন্সকে আলাদা করার ক্ষেত্রে একটি তুচ্ছ সুবিধা দিতে হবে।

আক্রমণকারীরা জেনারেট হওয়া সংখ্যার ক্রম অনুমান করতেও সক্ষম হতে পারে যখন অনুমানযোগ্য বীজ - যেমন বিকাশকারী দ্বারা হার্ডকোড করা - একটি PRNG বা CSPRNG শুরু করতে ব্যবহৃত হয়, কারণ আক্রমণকারী বীজটি অনুমান করতে পারে এবং এইভাবে PRNG দ্বারা উৎপন্ন আউটপুট পূর্বাভাস দিতে পারে।

প্রভাব

যদি একটি নন-ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত PRNG প্রমাণীকরণের মতো নিরাপত্তা প্রসঙ্গে ব্যবহার করা হয়, তাহলে একজন আক্রমণকারী এলোমেলোভাবে তৈরি হওয়া সংখ্যাগুলি অনুমান করতে এবং বিশেষ সুবিধাপ্রাপ্ত ডেটা বা কার্যকারিতায় অ্যাক্সেস পেতে সক্ষম হতে পারে।

প্রশমন

সাধারণ

  • নিরাপত্তার প্রভাব থাকলে java.security.SecureRandom ব্যবহার করুন
  • অন্য কোনো ক্ষেত্রে java.util.Random ব্যবহার করুন
  • কখনই Math.random ব্যবহার করবেন না!

java.security.SecureRandom

নিরাপত্তা ব্যবহারের জন্য প্রস্তাবিত . যদি লিনাক্স কার্নেল সংস্করণ 5.17+ হয় বা থ্রেড ব্লক করা গ্রহণযোগ্য হয়, আপনি র্যান্ডম সংখ্যা তৈরি করার আগে পর্যাপ্ত এনট্রপি জমা হওয়ার জন্য অপেক্ষা করুন (যেমন /dev/random ব্যবহার করুন)। এটি করতে, getInstanceStrong() কল করুন:

কোটলিন জাভা
val rand = SecureRandom.getInstanceStrong()
SecureRandom rand = SecureRandom.getInstanceStrong();

অন্যথায়, লিনাক্স কার্নেল সংস্করণে 5.17-এর আগে যখন র্যান্ডম সংখ্যা তৈরি করার সময় থ্রেড ব্লক করা অগ্রহণযোগ্য, তখন 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);
   
}
}

সম্পদ