Pertama, harap perhatikan bahwa CPUID jelas bukan penanda pengidentifikasi unik yang dapat diakses secara umum untuk sistem apa pun selain Intel Pentium III. Meskipun hashing dengan alamat MAC tentu saja dapat menyebabkan penanda unik, ini hanya disebabkan oleh kualitas unik dari MAC itu sendiri dan CPUID dalam hal ini tidak lebih dari keadaan langsung. Selain itu, hash yang dihasilkan tidak akan lebih unik dari UUID motherboard, dan itu jauh lebih mudah untuk diambil dan prosesnya jauh lebih mudah untuk dikorbankan. Dari wikipedia.org/wiki/cpuid :
EAX = 3 : Nomor Seri Prosesor
Lihat juga: Pentium III § Kontroversi tentang masalah privasi
Ini mengembalikan nomor seri prosesor. Nomor seri prosesor diperkenalkan pada Intel Pentium III, tetapi karena masalah privasi, fitur ini tidak lagi diterapkan pada model selanjutnya (bit fitur PSN selalu dihapus). Prosesor Efficeon dan Crusoe dari Transmeta juga menyediakan fitur ini. Namun CPU AMD, jangan mengimplementasikan fitur ini dalam model CPU apa pun.
Anda dapat melihat cpuid yang diurai sendiri dengan melakukan cat /proc/cpuinfo
atau bahkan adil lscpu
.
Ini memberi Anda semua alamat MAC untuk antarmuka jaringan yang dikenali oleh kernel linux, saya pikir:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
Mungkin perlu memfilter daftar itu jika mungkin menyertakan nics virtual dengan MAC yang dibuat secara acak. Anda dapat melakukan ini dengan bendera dalam panggilan untuk ip
secara langsung. Lihat ip a help
informasi tentang cara melakukannya.
Perhatikan juga bahwa masalah ini tidak unik ip
dan harus juga ditangani jika Anda menggunakannya ifconfig
, tetapi dapat ditangani dengan lebih andal ip
- yang merupakan bagian dari rangkaian iproute2
jaringan dan dipelihara secara aktif - daripada yang dapat dilakukan ifconfig
- yang merupakan anggota dari net-tools
paket dan melihat lalu Linux rilis pada tahun 2001 . Karena perubahan fitur di kernel sejak rilis terakhir, ifconfig
diketahui salah melaporkan beberapa tanda fitur jaringan dan penggunaannya harus dihindari jika memungkinkan.
Namun, pahami bahwa pemfilteran dengan nama antarmuka kernel seperti eth[0-9]
bukan cara yang dapat diandalkan untuk melakukan hal itu, karena ini dapat berubah berdasarkan urutan deteksi paralel mereka udev
selama proses boot. Silakan lihat Nama Jaringan yang Dapat Diprediksi untuk informasi lebih lanjut tentang itu.
Karena dmidecode
tidak diinstal pada sistem saya, saya awalnya berpikir untuk hash daftar serial hard disk yang dihasilkan seperti:
lsblk -nro SERIAL
Lakukan lsblk --help
untuk beberapa petunjuk tentang memperbaiki daftar itu - menurut jenis disk, katakanlah. Pertimbangkan juga lspci
dan / atau lsusb
mungkin.
Menggabungkannya mudah:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
Ketika Anda memberi tahu saya bahwa Anda memasukkan sumber daya pengguna di ujung Anda ke id uniknya, dan hard disk tidak dapat diandalkan, saya pikir akan mengubah taktik saya.
Yang dipertimbangkan, saya melihat ke sistem file lagi dan menemukan /sys/class/dmi/id
folder. Saya memeriksa beberapa file:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
Namun, yang ini sepertinya cukup bagus, tapi saya tidak akan mempublikasikan hasilnya:
sudo cat /sys/class/dmi/id/product_uuid
Saya berharap di situlah dmidecode
mendapatkan banyak informasi dan sebenarnya itu memang terlihat seperti itu . Menurut man dmidecode
Anda, Anda juga dapat menyederhanakan penggunaan alat itu dengan banyak dengan menetapkan argumen:
dmidecode -s system-uuid
Lebih sederhana lagi, Anda hanya bisa membaca file. Perhatikan bahwa file khusus ini mengidentifikasi motherboard. Berikut adalah kutipan dari tambalan kernel 2007 yang awalnya menerapkan ekspor ini ke /sysfs
sistem file virtual:
+DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_date, 0444, DMI_BIOS_DATE);
+DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor, 0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(product_name, 0444, DMI_PRODUCT_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(product_version, 0444, DMI_PRODUCT_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(product_serial, 0400, DMI_PRODUCT_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(product_uuid, 0400, DMI_PRODUCT_UUID);
+DEFINE_DMI_ATTR_WITH_SHOW(board_vendor, 0444, DMI_BOARD_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(board_name, 0444, DMI_BOARD_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(board_version, 0444, DMI_BOARD_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(board_serial, 0400, DMI_BOARD_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(board_asset_tag, 0444, DMI_BOARD_ASSET_TAG);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_vendor, 0444, DMI_CHASSIS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_type, 0444, DMI_CHASSIS_TYPE);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_version, 0444, DMI_CHASSIS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_serial, 0400, DMI_CHASSIS_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_asset_tag, 0444, DMI_CHASSIS_ASSET_TAG);
Anda mungkin dapat menggunakan data itu sendiri untuk mengidentifikasi sistem - jika motherboard sudah cukup. Tetapi Anda dapat menggabungkan informasi ini dengan MAC sistem dengan cara yang sama seperti yang saya tunjukkan yang mungkin Anda lakukan dengan hard disk:
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
Kernel Linux juga dapat menghasilkan UUID untuk Anda:
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
Atau:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
Memang, ini dibuat secara acak dan Anda harus memikirkan kembali penugasan ID, tapi itu semudah mendapatkan setidaknya. Dan itu harus cukup solid jika Anda dapat menemukan cara untuk menguncinya.
Terakhir, pada sistem UEFI ini menjadi jauh lebih mudah dilakukan - karena setiap variabel lingkungan firmware EFI menyertakan UUID sendiri. Variabel lingkungan {Platform,}LangCodes-${UUID}
harus ada pada setiap sistem UEFI, harus bertahan reboot dan bahkan sebagian besar pembaruan dan modifikasi firmware, dan sistem Linux apa pun dengan efivarfs
modul yang dimuat dapat mencantumkan salah satu atau kedua nama hanya dengan:
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
Bentuk yang lebih lama - LangCodes-${UUID}
tampaknya sekarang sudah tidak digunakan lagi , dan pada sistem yang lebih baru seharusnya PlatformLangCodes-${UUID}
tetapi, menurut spesifikasi, satu atau yang lain harus ada di setiap sistem UEFI. Dengan sedikit usaha, Anda dapat mendefinisikan variabel persisten reboot Anda sendiri, dan mungkin memanfaatkan generator UUID kernel dengan cara itu. Jika tertarik, lihatlah efitools .