Dalam skenario di mana Anda mengontrol penyediaan perangkat keras dan dapat menentukan bahwa semua perangkat dengan model perangkat keras yang sama memang memiliki alamat MAC unik untuk antarmuka jaringan mereka, apakah ada kelemahan dalam menulis kode yang menggunakan asumsi itu? (Catatan berdasarkan beberapa balasan: Saya tidak akan menulis kode jaringan menggunakan asumsi ini. Ini hanya dimaksudkan sebagai cara dengan sentuhan rendah untuk memiliki uuid per perangkat tanpa harus secara manual membuat dan memperbarui HDD perangkat dengan id sebelum penggelaran ke lapangan)
Backstory untuk ini adalah saya sedang meneliti implementasi perangkat keras IOT jenis implementasi untuk klien. Kami akan menyediakan satu set perangkat perangkat keras dengan kemampuan jaringan untuk dipasang di lokasi terpencil. Perangkat ini kemudian akan berkomunikasi kembali ke API dengan mengirim pesan. Untuk mengurangi kompleksitas pengaturan, saya berharap untuk mengirim alamat MAC dari antarmuka jaringan pada perangkat dalam pesan, untuk mengikat pesan-pesan ini kembali ke "device_id" di sisi API. Pikir saya adalah bahwa dengan membuatnya menjadi sesuatu yang tidak harus diatur pada perangkat sebelum digunakan, itu hanya dapat ditanyakan selama operasi normal. Saya dapat dengan aman berasumsi bahwa kita dapat menentukan bahwa alamat MAC dari setiap perangkat sebenarnya unik,
sumber
Jawaban:
Berdasarkan pada pernyataan Anda bahwa Anda dapat mengonfirmasi selama menetapkan bahwa MAC pabrikan sebenarnya unik dalam jaringan perangkat yang Anda buat (yang tidak dengan sendirinya merupakan kepastian, meskipun seharusnya), Anda mungkin melanjutkan dengan baik, tetapi pertimbangkan pertanyaan-pertanyaan berikut:
Apakah Anda menggunakan MAC untuk pemeriksaan keamanan (otentikasi, otorisasi)? Jika demikian, MAC tidak cukup. Bahkan tidak mempertimbangkannya. Gunakan struktur kriptografi, dan kirimkan permintaan auth aman.
Apakah 48 bit cukup lebar? Mungkin, tapi patut ditanyakan.
Apakah Anda perlu memperbaiki perangkat dengan mengganti nic?
Jika Anda mengganti perangkat secara keseluruhan, atau mengganti nic, apakah Anda harus dapat mengaitkan alamat baru ke kunci yang ada dalam database Anda untuk memastikan kesinambungan pengumpulan data untuk lokasi penempatan?
Apakah akan ada antarmuka perawatan yang dengannya pengguna (resmi atau tidak) dapat mengubah nic di tingkat ROM, driver, atau OS? Seorang penyerang dapat memperkenalkan kelemahan pada data Anda jika mereka memodifikasi MAC.
Apakah data Anda akan digabungkan dengan sumber data lain menggunakan MAC sebagai kunci?
Apakah Anda pernah menggunakan MAC untuk tujuan jaringan apa pun selain hanya menavigasi LAN layer2 yang terhubung dengan perangkat (kabel atau nirkabel)?
Apakah LAN yang terhubung dengan perangkat Anda, menjadi jaringan pribadi, atau jaringan yang akan menghubungkan banyak klien sementara (seperti telepon seluler karyawan)?
Jika jawaban Anda benar
maka saya tidak bisa memikirkan kesalahan nyata dalam rencana Anda.
Perlu diingat, Anda tidak perlu MAC unik secara global untuk melakukan ini; Anda hanya perlu memastikan bahwa subset perangkat Internet yang memanggil API Anda unik. Sama seperti duplikat nic yang ditugaskan di dua kota yang berbeda tidak dapat bertabrakan karena mereka berada di LAN yang berbeda, Anda tidak dapat memiliki collision kunci basis data pada MAC jika tidak pernah memanggil API Anda.
sumber
Alamat MAC tidak unik
Mungkin ada, dan akan ada duplikat dengan MAC. Ada beberapa alasan untuk itu, salah satunya adalah bahwa mereka tidak perlu (secara global) unik.
MAC harus unik di jaringan lokal, sehingga ARP / NDP dapat melakukan tugasnya, dan switch tahu ke mana harus mengirim datagram yang masuk. Biasanya (belum tentu) bahwa prasyarat terpenuhi dan semuanya berfungsi dengan baik, hanya karena kemungkinan memiliki dua MAC yang identik pada LAN yang sama, bahkan jika mereka tidak unik, cukup rendah.
Alasan lain adalah hanya ada lebih banyak perangkat daripada alamat. Sementara alamat 48 bit terdengar seperti ada cukup alamat untuk semua orang sampai akhir hari, itu tidak terjadi.
Ruang alamat dibagi menjadi dua bagian 24-bit (ini sedikit lebih rumit, tapi mari kita abaikan detail kecilnya). Setengahnya adalah OUI yang bisa Anda daftarkan dengan IEEE dan tetapkan ke perusahaan Anda sekitar 2.000 dolar. Sisanya 24 bit, Anda melakukan apa pun yang Anda inginkan. Tentu saja Anda dapat mendaftarkan beberapa OUI, yang merupakan apa yang pemain besar lakukan.
Ambil Intel sebagai contoh. Mereka telah mendaftarkan total 7 OUI, memberi mereka total 116 juta alamat.
Mainboard komputer saya (yang menggunakan chipset X99) dan mainboard laptop saya serta mainboard dari setiap komputer berbasis x86 yang saya miliki selama 10-15 tahun terakhir memiliki kartu jaringan Intel sebagai bagian dari chipset. Tentu saja ada lebih dari 116 juta komputer berbasis Intel di dunia. Dengan demikian, MAC mereka tidak mungkin unik (dalam arti global unik).
Juga, kasus telah dilaporkan tentang uh ... lebih murah ... produsen hanya "mencuri" alamat dari OUI orang lain. Dengan kata lain, mereka hanya menggunakan alamat acak. Saya pernah mendengar tentang produsen yang hanya menggunakan alamat yang sama untuk rangkaian produk yang lengkap juga. Tak satu pun dari itu benar-benar sesuai atau masuk akal, tetapi apa yang dapat Anda lakukan tentang itu. Kartu jaringan ini ada. Sekali lagi: Kemungkinan itu menjadi masalah praktis masih sangat rendah jika alamat digunakan untuk apa yang dimaksudkan, Anda perlu memiliki dua dari mereka di LAN yang sama untuk memperhatikan.
Sekarang, apa yang harus Anda lakukan dengan masalah Anda?
Solusinya mungkin lebih sederhana dari yang Anda pikirkan. Perangkat IoT Anda kemungkinan besar akan membutuhkan waktu, biasanya waktu secara otomatis diperoleh melalui NTP. Ketepatan khas NTP adalah dalam rentang mikrodetik (ya, itu mikro, bukan mili). Saya hanya berlari
ntpq -c rl
untuk memastikan dan diberitahu 2 -20 .Kemungkinan dua perangkat Anda dinyalakan untuk pertama kalinya pada mikrodetik yang sama persis sangat rendah. Secara umum mungkin terjadi (terutama jika Anda menjual jutaan dari mereka dalam waktu yang sangat singkat, selamat atas kesuksesan Anda!), Tentu saja. Tapi itu tidak terlalu mungkin - dalam praktiknya itu tidak akan terjadi. Dengan demikian, hemat waktu setelah boot pertama kali di toko permanen.
Waktu boot perangkat IoT Anda akan sama pada setiap perangkat. Kecuali itu tidak benar sama sekali .
Diberi timer resolusi tinggi, waktu boot berbeda secara terukur bahkan pada perangkat yang sama, setiap waktu. Mungkin hanya beberapa jam yang berbeda (atau beberapa ratus ribu, jika Anda membaca sesuatu seperti penghitung waktu CPU), jadi tidak terlalu unik sama sekali, tetapi tentu saja menambahkan beberapa entropi.
Demikian pula, waktu yang diperlukan
connect
untuk kembali saat pertama kali Anda mengakses situs API Anda akan sedikit, tetapi terukur, berbeda setiap waktu. Demikian pula,getaddrinfo
akan mengambil jumlah waktu yang sedikit berbeda dan terukur untuk setiap perangkat saat mencari nama host API web Anda untuk pertama kalinya.Gabungkan tiga atau empat sumber entropi (alamat MAC, waktu penyalaan pertama, waktu untuk boot untuk pertama kalinya, hubungkan waktu) dan hitung hash dari situ. MD5 akan baik-baik saja untuk tujuan itu. Di sana, Anda unik.
Meskipun itu tidak benar - benar menjamin keunikan, itu "cukup banyak" menjaminnya, dengan kemungkinan kegagalan yang bisa diabaikan. Anda harus memiliki dua perangkat dengan MAC identik yang dihidupkan untuk pertama kalinya pada mikrodetik yang sama, dan mengambil waktu yang sama persis untuk mem-boot, dan untuk terhubung ke situs Anda. Itu tidak akan terjadi. Jika itu terjadi, Anda harus segera mulai bermain lotre karena untuk semua penampilan, Anda dijamin akan menang.
Namun, jika "tidak akan terjadi" tidak cukup baik sebagai jaminan, cukup berikan setiap perangkat angka yang meningkat secara berurutan (dihasilkan di server) saat pertama kali mereka mengakses API web Anda. Biarkan perangkat menyimpan nomor itu, selesai.
sumber
ntpq -c rl?
Karena masalah di sini benar-benar merupakan Masalah XY, saya akan membahas pemecahannya: bagaimana cara mendapatkan pengidentifikasi unik untuk sebuah perangkat keras saat pertama kali melakukan booting tanpa harus melakukan pramuat pengidentifikasi ke dalamnya. Semua metode yang baik benar-benar bermuara pada satu hal: memiliki sumber entropi.
Jika perangkat keras Anda memiliki sesuatu yang dirancang untuk menjadi sumber entropi perangkat keras (catatan: ini pada dasarnya merupakan persyaratan untuk implementasi perangkat IoT yang tepat karena diperlukan untuk TLS, jadi perangkat keras Anda harus dirancang dengan mengingat hal itu), gunakan saja itu. Jika tidak, Anda harus kreatif.
Untungnya, hampir setiap komputer yang pernah dibuat memiliki sumber entropi yang sangat baik: osilator kristal (jam). Laju kristal yang diberikan tidak hanya tergantung pada perubahan suhu yang halus, tetapi juga tunduk pada histeresis suhu dengan cara nonlinier. Namun, untuk mengukur entropi, Anda perlu jam kedua untuk menghitung waktu pertama. Artinya, setiap kali komputer Anda memiliki setidaknya dua jam yang dapat Anda sampel, Anda dapat menggunakan laju satu yang diukur oleh yang lain sebagai sumber entropi berkualitas sangat tinggi.
sumber
Saya tidak ingin langsung menjawab pertanyaan karena ada respons lain yang sangat baik tetapi saya ingin menyarankan nilai lain yang lebih cocok yang mungkin tersedia untuk digunakan sebagai id perangkat.
Jika didukung oleh perangkat keras Anda, Anda dapat mempertimbangkan menggunakan SMBIOS UUID. Ini adalah id unik untuk mainboard dan perangkat. Ingatlah bahkan perangkat IoT dapat memiliki beberapa NIC (LAN & WiFi) jadi jika Anda memilih rute MAC, Anda masih perlu menemukan metode untuk memilih satu secara konsisten.
Selain itu, meskipun UUID unik, tidak boleh digunakan untuk tujuan keamanan karena hanya dijamin unik dalam lingkungan yang ramah.
sumber
Saya benci mengasumsikan masalah XY karena sering OP memiliki alasan kompleks meskipun baik untuk melakukan hal-hal seperti yang mereka lakukan tetapi Anda mungkin ingin melihat metode lain untuk menghasilkan pengidentifikasi unik untuk setiap perangkat yang, seperti alamat MAC , "bawaan" ke perangkat dan tidak perlu membuat pengenal Anda sendiri.
Jika semua perangkat berasal dari pabrikan yang sama (atau, bahkan lebih baik, model yang sama) Anda dapat menggunakan nomor seri untuk menghasilkan pengidentifikasi. Ini tidak bekerja dengan baik di seluruh perangkat dari pabrikan yang berbeda, bahkan jika Anda menggabungkannya dengan nama pabrikan dan nomor model, karena format nomor seri yang berbeda dan kemungkinan API yang berbeda untuk mendapatkan nomor seri dalam hal perangkat tertanam / berpemilik . Alternatif untuk nomor seri perangkat mungkin nomor seri motherboard, CPU, atau hard disk (saya percaya lisensi Windows menggunakan kombinasi dari ini).
Perlu diingat juga bahwa pemformat sistem file biasanya menghasilkan ID unik untuk setiap sistem file. Kecuali jika Anda menyiapkan semua perangkat dari gambar yang sama (yang saya sarankan lakukan, untuk alasan yang tidak terkait), setiap hard disk sudah memiliki ID unik yang disimpan dalam sistem file yang dapat Anda gunakan.
Karena itu, sebenarnya tidak ada alasan untuk tidak menggunakan alamat MAC, terutama jika sebagai bagian dari proses penyediaan Anda, Anda dapat menentukan bahwa mereka sebenarnya unik (meskipun ini bahkan tidak perlu, dengan asumsi kita berbicara tidak lebih dari beberapa ribu perangkat di sini). Tentu saja, ingatlah bahwa apa pun yang Anda gunakan dapat dipalsukan oleh perangkat, jadi jangan mengandalkan ini untuk otentikasi di lingkungan yang tidak terpercaya (Anda mengatakan itu adalah pengaturan pribadi sehingga mungkin ini adalah lingkungan "tepercaya" di mana Anda tidak Peduli tentang klien Anda yang memalsukan perangkat mereka sendiri terhadap server mereka sendiri, tetapi mereka harus mengingat hal ini jika manajemen perangkat diserahkan kepada pihak ketiga atau pengguna akhir).
sumber