/ Dev / এলোমেলোভাবে কেন লিখতে / dev / এলোমেলো থেকে সমান্তরাল পাঠ দ্রুত হয় না?


22

সাধারণত /dev/random100-500 বাইট এবং ব্লক থেকে পড়া থেকে এনট্রপি সংগ্রহের জন্য অপেক্ষা করা হয়।

/dev/randomঅন্যান্য প্রক্রিয়া দ্বারা তথ্য লিখিতভাবে পড়া দ্রুত হয় না কেন ? এটি প্রয়োজনীয় এন্ট্রপি সরবরাহ করা উচিত নয়?

এটি gpgঅ- ব্লক করা বা অনুরূপ সফ্টওয়্যারটি পুনরায় আরম্ভ না করে এবং পুনরায় প্রবেশ না করে, অ-সুপার-টপ-সিক্রেট কীগুলি তৈরি করার জন্য, ইত্যাদি কার্যকর হতে পারে etc.


3
কেবল /dev/urandomপরিবর্তে পড়ুন। ক্রিপ্টোগ্রাফিক ব্যবহারের /dev/urandomমতোই সুরক্ষিত/dev/random , এর আচরণটি /dev/randomখারাপ ডিজাইন।
গিলস 'অতএব খারাপ হওয়া বন্ধ করুন'

1
কিভাবে স্যুইচ করতে gpg --gen-keyথেকে /dev/randomথেকে /dev/urandomপুনরায় চালু ছাড়া?
vi।

IIRC gpgহয়েছে /dev/randomহার্ড কোডেড। অন্যান্য সম্ভাবনার মধ্যে /dev/randomএকই ডিভাইসটি তৈরি করতে আপনি আপনার udev কনফিগারেশন পরিবর্তন করতে পারেন /dev/urandom
গিলস 22'9

@ গিলস, এটি এখনও পুনরায় চালু করা প্রয়োজন gpg --gen-key, অতএব এটি আন্তঃসংযোগের সাথে জিজ্ঞাসা করে (বা আরও কমান্ড লাইন প্যারামিটারগুলি নির্দিষ্ট করার মতো আরও চতুর পদ্ধতি ব্যবহার করে) এমন ডেটা পুনরায় প্রেরণা প্রয়োজন । এছাড়াও প্রাইম তৈরির সময় সিপিইউয়ের সময়টি হারাতে হবে (জিপিজি এক মিনিট কাজ করতে পারে, কিছু এএস মুদ্রণ করতে পারে +এবং তার পরে অতিরিক্ত এলোমেলো ডেটা অনুরোধ করতে পারে)। এবং এটি "আসুন ফিরে যাই এবং অন্য পথে চলি" এর পরিবর্তে "আসুন হাতুড়িটি ধরে এগিয়ে নিয়ে যেতে" এর অনুভূতি দেয় ...
vi।

উত্তর:


19

আপনি লিখতে পারেন /dev/randomকারণ এটি অতিরিক্ত এলোমেলো বাইট সরবরাহ করার উপায়ের অংশ /dev/random, তবে এটি পর্যাপ্ত নয়, আপনাকে ioctl()কলটি দিয়ে অতিরিক্ত এনট্রপি রয়েছে এমন সিস্টেমটিও অবহিত করতে হবে ।

আমার স্মার্টকার্ড সেটআপ প্রোগ্রামটি পরীক্ষা করার জন্য আমার একই কার্যকারিতাটির প্রয়োজন ছিল , কারণ আমি প্রতিটি মাউস / কীবোর্ডের gpgজন্য প্রতিটি পরীক্ষার জন্য চালানো বেশ কয়েকটি কলের জন্য পর্যাপ্ত পরিমাণে উত্পন্ন করতে অপেক্ষা করতে চাইনি । আমি যা করেছি তা হল পাইথন প্রোগ্রামটি চালানো, যা অনুসরণ করে আমার পরীক্ষার সমান্তরালে। এটি অবশ্যই বাস্তব কী প্রজন্মের জন্য মোটেও ব্যবহার করা উচিত নয়gpg , কারণ এলোমেলো স্ট্রিং মোটেও এলোমেলো নয় (সিস্টেমের দ্বারা উত্পাদিত এলোমেলো তথ্য এখনও ইন্টারলিভড থাকবে)। যদি আপনার কাছে স্ট্রিং সেট করার জন্য কোনও বাহ্যিক উত্স থাকে random, তবে আপনার উচ্চ এনট্রপি পাওয়া উচিত। আপনি এর সাথে এনট্রপি পরীক্ষা করতে পারেন:

cat /proc/sys/kernel/random/entropy_avail

কার্যক্রম:

#!/usr/bin/env python
# For testing purposes only 
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
    time.sleep(0.001)

(আপনার কাজ শেষ হওয়ার পরে প্রোগ্রামটি হত্যা করতে ভুলবেন না))


1
অনেক সহজ সমাধান ব্যবহার করা হবে rngd। এটি বেশিরভাগ (সমস্ত?) ডিস্ট্রোজে প্যাকেজ হিসাবে উপলব্ধ।
প্যাট্রিক

4
random = "3420348024823049823-984230942049832423l4j2l42j"দেখতে xkcd.com/221
user253751

@ পেট্রিক আমি এলোমেলো যোগ করার জন্য কমপক্ষে 3 টি সম্ভাব্য সমাধান চেষ্টা করেছি, IIRC rngd এর মধ্যে অন্যতম ছিল of তবে তারা বাক্সটির বাইরে কাজ করবে না (এটি উবুন্টু 12.04 সেটআপটি তখনকার সময়ে হতে পারে) এবং আমার জন্য 10 লাইনের কোড সহ এই সমাধানটি সহজ ছিল।
অ্যান্থন

@ অ্যান্টন: সাইদেনোট হিসাবে, আমি xs4all.nl বলে মনে করি না, যেহেতু মিটনিক এটি কয়েক দশক আগে কিছু জিনিস সঞ্চয় করতে ব্যবহার করেছিল ... :)
ওলিভিরাজর

@ ওলিভিরাজর, আমি 1992 সালে কোথাও স্থানান্তরিত হ্যাকটিক.এনএল থেকে আমার অ্যাকাউন্ট পেয়েছিলাম, আমি সেখানে কিছুকাল রয়েছি যদিও আমি এখন 20 বছরের বেশি সময় ধরে নেদারল্যান্ডসে বাস করি নি।
অ্যান্থন

14

সাধারণত, এটি কার্নেল বিকাশকারীগণ দ্বারা ডিজাইন করেছেন এবং এতে নথিভুক্ত করেছেন man 4 random:

Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count.  This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.

1

অ্যান্টনি ইতিমধ্যে ব্যাখ্যা করেছে যে লিখতে /dev/randomএনট্রপি গণনা বাড়বে না এবং দেখিয়েছে কীভাবে RNDADDENTROPY ioctl ( এলোমেলো (4%) দেখুন এনট্রপির জন্য ক্রেডিট হিসাবে ব্যবহার করা যেতে পারে। এটি স্পষ্টতই নিরাপদ নয়, সুতরাং যখন একটি হার্ডওয়্যার এলোমেলো সংখ্যা জেনারেটর উপলব্ধ থাকে তখন এখানে বিকল্প রয়েছে।

নিম্নলিখিত প্রয়োগগুলি 512 বাইট (4096 বিট) এলোমেলোভাবে /dev/hwrngএন্ট্রপি পুলের কাছে এনে ফরোয়ার্ড করে দেয় (বাইট প্রতি এনট্রপির 4 বিট জমা দেওয়া, এটি আমার পক্ষ থেকে একটি স্বেচ্ছাসেবী পছন্দ)। এর পরে এটি এনট্রপি পুলটি পূর্ণ ( র্যান্ডম (4) ম্যানপেজে ডকুমেন্টেড ) হয়ে গেলে সিলেক্ট করা (2) সিস্কেলকে ব্লক করতে অনুরোধ করবে ।

পাইথনের একটি সংস্করণ:

import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
    while True:
        d = hw.read(512)
        fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
        select.select([], [rnd], [])

আর্চ লিনাক্স আইসোতে পাইথন ইনস্টল করা নেই, তাই এখানে পার্ল সংস্করণও রয়েছে:

open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
    my $l = read $hw, my $d, 512;
    ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
    vec(my $w, fileno $rnd, 1) = 1;
    select undef, $w, undef, undef
}

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


আপনার যদি কোনও হার্ডওয়্যার এলোমেলো নম্বর জেনারেটর /dev/urandomনা থাকে /dev/hwrngতবে আপনি যদি অনিরাপদ এলোমেলো মানগুলির যত্ন নিচ্ছেন না তার পরিবর্তে আপনি ব্যবহার করতে পারেন ।
লেকেনস্টেইন

হুম, আমি আবিষ্কার করেছি যে hwrng ডিভাইসগুলি যখন প্রয়োজন হয় তখন স্বয়ংক্রিয়ভাবে এনট্রপি তৈরি করে, কোনও অতিরিক্ত আরএনজিডি বা স্ক্রিপ্টের প্রয়োজন হয় না। সেখানে একটি বাগ যদিও যখন getrandom()প্রাপ্ত syscall চেয়ে 4.8-rc1 পুরোনো কার্নেলের উপর hwrng সঙ্গে ব্যবহার করা হয় যে আচরণ ব্লকিংয়ের ফলাফল নেই। এর read()থেকে দ্বিগুণ কাজ করা উচিত /dev/random, github.com/Lekensteyn/archdir/commit/… দেখুন
লেকেনস্টেইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.