Seorang kolega menyarankan untuk membuat kunci acak melalui perintah berikut:
tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 32 | xargs
Itu memberi saya kesalahan:
tr: Urutan byte ilegal
Saya khawatir bahwa saya tidak memiliki /dev/urandom
sistem saya. Saya mencoba googling untuk mencari tahu cara menginstal file ini, tetapi saya sudah kosong. Saya mencoba locate urandom
dan juga muncul kosong. (Yah, sebenarnya, itu menemukan halaman manual, tapi itu tidak membantu)
Bagaimana cara saya membuat urandom
tersedia di sistem Mac OSX saya? (Singa)
xargs
...Jawaban:
Berdasarkan pesan kesalahan yang Anda dapatkan, saya tidak berpikir / dev / urandom adalah masalahnya. Jika ya, saya akan mengharapkan kesalahan seperti "tidak ada file atau direktori".
Saya mencari pesan kesalahan yang Anda dapatkan dan menemukan ini, yang sepertinya relevan dengan masalah Anda: http://nerdbynature.de/s9y/2010/04/11/tr-Illegal-byte- berikutnyaence
Pada dasarnya, tentukan lokal dengan menambahkan
tr
perintah denganLC_CTYPE=C
:sumber
urandom
ataurandom
? Apakah mereka "file" magis khusus yang tidak ada pada sistem file yang sebenarnya? (Juga saya menyarankan edit untuk membantu mengurangi tautan-busuk)locate
tidak secara langsung mencari sistem file Anda, tetapi mencari permintaan Anda menggunakan database yang sudah dibuat sebelumnya. Basis data ini kemungkinan besar dikonfigurasi untuk mengabaikan / dev / dan sistem file 'khusus' lainnya./dev
. Sosok pergi. Tapi sekali lagi terima kasih atas bantuannya.LC_ALL=C
melakukan trik tho.tr
informasi.tr
Upaya Anda untuk menafsirkan inputnya sebagai teks dalam pengkodean UTF-8. Jadi itu akan mengeluh dan membatalkan urutan byte pertama yang tidak valid UTF-8. Awalantr
denganLC_ALL=C
atauLC_CTYPE=C
akan mengekspor variabel itu ke lingkungantr
, sehingga mengubah idenya tentang karakter lokal diatur ke standar C, yaitu semuanya hanya urutan byte buram.Omong-omong, apakah urutan
\)-+
perintah Anda disengaja? Ini termasuk*
juga, yang sudah Anda sertakan, tetapi tidak termasuk-
itu sendiri seperti yang Anda maksudkan. Lebih baik menulis salah satu dari ini sebagai gantinya:sumber
Seperti yang telah ditunjukkan orang lain, masalah Anda bukanlah yang
/dev/urandom
hilang, melainkan bagaimana caratr
kerjanya pada OS X. Alih-alih bermain-main dengan enviornment varialbes, gunakanperl
sebagai penggantitr
:Ini memiliki keuntungan menjadi portabel di OS X, Redhat dan Ubuntu.
(Saya juga melepas pipa untuk
xargs
, mengganti penyihirecho
, untuk mendapatkan baris baru di akhir output.)sumber
binmode ":utf8"
standar, pada titik mana solusi Perl Anda akan memiliki masalah yangtr
sama.Pertama, apakah Anda bermaksud untuk memasukkan
-
atau*
dalam daftar karakter yang valid? Parameter untuktr
memasukkan urutan)-+
yang berarti "kisaran byte dimulai dengan)
dan diakhiri dengan+
, yang sebenarnya)*+
.Kedua, daripada membaca banyak kilobyte dari kumpulan entropi kernel (dan dengan demikian menandai keseluruhan kumpulan sebagai tidak aman, yang akan memengaruhi proses lain yang memerlukan entropi aman), pertimbangkan untuk membaca hanya sebanyak mungkin bit yang Anda butuhkan: gunakan
head -c...
sebagai langkah pertama , dan kemudian menerjemahkan alih-alih membuang karakter yang tidak diinginkan.Versi khusus masalah ini agak tidak biasa karena menggunakan 76 simbol yang berbeda; kebanyakan hanya ingin alfanumerik, jadi jika Anda akan puas hanya dengan 64 simbol, maka menggunakan
base64
utilitas akan meminimalkan konsumsi kumpulan entropi (perhatikan bahwa 24 adalah 6/8 dari 32):sumber
Pengkodean karakter lokal Anda (yang dapat Anda ketahui
locale charmap
) adalah multi-byte per karakter.Yang paling umum saat ini adalah UTF-8 di mana karakter dapat dikodekan lebih dari 1 hingga 4 byte. Tidak semua urutan byte membentuk karakter yang valid di UTF-8. Setiap karakter non-ASCII dalam UTF-8 mulai dengan satu byte yang memiliki dua bit tertinggi yang ditetapkan dan memberi tahu berapa banyak byte dengan set bit tertinggi (tetapi bukan yang tertinggi kedua) diikuti.
/dev/urandom
berisi aliran byte acak.tr
mentransliterasi karakter, sehingga perlu mendekode byte tersebut sebagai karakter. Semua karakter ASCII dalam jangkauan Anda semua dikodekan pada satu karakter di UTF-8, tetapitr
masih perlu mendekodekan semua karakter. Misalnya ada pengkodean multi-byte lainnya di mana beberapa karakter selainA
berisi 0x41 byte (kode untukA
).Karena aliran byte acak itu pasti mengandung urutan yang tidak valid (misalnya 0x80 byte dengan sendirinya tidak valid dalam UTF-8 karena karakter non-ASCII harus dimulai dengan byte yang lebih besar dari 0xc1 (0xc0 dan 0xc1 tidak ada dalam UTF- 8 karakter)), jadi
tr
kembali dengan kesalahan saat itu terjadi.Apa yang Anda inginkan di sini adalah mempertimbangkan aliran byte sebagai karakter dalam penyandian yang memiliki satu byte per karakter. Apa pun yang Anda pilih tidak penting karena semua karakter dalam rentang Anda (dengan asumsi oleh AZ, yang Anda maksud adalah ABCDEFGHIJKLMNOPQRSTUVWXYZ dan bukan hal-hal seperti
Ý
,Ê
) adalah bagian dari rangkaian karakter portabel sehingga dikodekan sama di semua rangkaian karakter yang didukung pada sistem Anda.Untuk itu, Anda akan menetapkan
LC_CTYPE
variabel lokalisasi yang merupakan variabel yang menentukan charset yang digunakan dan hal-hal seperti apablank
,alpha
kelas karakter berisi. Tetapi untuk definisi rentang AZ, Anda juga ingin mengaturLC_COLLATE
variabel (variabel yang menentukan urutan string).The
C
aliasPOSIX
lokal adalah salah satu yang jaminan karakter single-byte dan AZ adalah ABCDEFGHIJKLMNOPQRSTUVWXYZ. Anda bisa melakukannya:(di sini memindahkan
-
ke ujung, jika tidak,)-+
akan diambil sebagai rentang sepertiA-Z
)Tetapi perhatikan bahwa
LC_ALL
variabel menimpa semua variabelLC_*
dan lainnyaLANG
. Jadi, jikaLC_ALL
sudah ditentukan, hal di atas tidak akan berpengaruh. Jadi, alih-alih, Anda cukup melakukannya:Itu akan memengaruhi hal-hal lain seperti bahasa pesan kesalahan, tetapi bagaimanapun, mengubah LC_CTYPE bisa saja menjadi masalah untuk pesan kesalahan (misalnya, tidak ada cara untuk mengekspresikan pesan kesalahan Rusia atau Jepang di charset dari lokal C).
sumber
Menurut halaman manual , / dev / random mungkin akan cukup untuk kebutuhan Anda. Mungkin Apple berhenti membuat / dev / urandom karena itu tidak perlu?
sumber
/dev/random
.