Menyimpan kunci aman di memori perangkat tertanam

10

Saya bekerja pada perangkat tertanam yang mengirim / menerima data dan menyimpannya dalam mode ciphertext (mode terenkripsi). Sekarang apa pendekatan terbaik untuk menyimpan kunci (saya menggunakan ARM CORTEX M series MCU)?

1-Menyimpan kunci dalam memori SRAM dan dalam setiap urutan booting, menyuntikkan kunci ke MCU tertanam dan menyimpannya dalam memori SRAM. Cara terbaik menurut saya, maka ketika MCU merasakan penetrasi (dengan sensor tamper atau ...) ia dapat menghapus SRAM dengan cepat dan mengatur ulang sendiri. Kerugian: jika penyerang berhasil melewati tamper dan akses ke perangkat, seberapa aman memori SRAM (terhadap penambangan kode). Saya tidak dapat menemukan kemampuan keamanan untuk memori ini di MCU.

2-Hasilkan kunci dan simpan di memori flash dalam pemrograman MCU. MCU flash memory mendukung CRP (code read protection) yang mencegah dari penambangan kode dan dengan bantuan mesin AES internal dan mesin RNG (pembuatan angka acak) kita dapat membuat kunci acak dan mengenkripsi memori flash dan menyimpan kunci acak itu di OTP ( satu kali memori yang dapat diprogram - memori terenkripsi 128 bit), maka dalam eksekusi kode kami mendekode memori flash dengan kunci RNG dan akses ke kunci dan kode awal. Kerugian: Kunci yang disimpan dalam memori yang tidak mudah menguap, tamper tidak akan berguna dan penyerang punya banyak waktu untuk menambang kunci.

Kunci 3-Tersimpan dalam memori EEPROM, kombinasi dari 2 pendekatan di atas, kunci disimpan dalam memori yang tidak mudah menguap tetapi ketika mengutak-atik penetrasi, EEPROM dapat dihapus.

Saya menganggap LPC18S57FBD208 (korteks m3 dengan memori flash 1MB, 180MHZ, SRAM 136KB, EEPROM 16KB dan pengontrol LCD TFT yang saya perlukan untuk mengemudikan 7 "TFT LCD dan mesin kripto AES 128 bit) untuk apakah ada saran lain yang lebih baik?

Mahmoud Hosseinipour
sumber

Jawaban:

18

Tidak satu pun dari opsi-opsi itu yang secara khusus lebih baik atau lebih buruk daripada yang lain, karena semuanya sangat tidak aman. Saya akan dengan opsi 4.

  1. SRAM adalah tempat paling aman untuk menyimpan kunci, tetapi Anda tidak boleh menyuntikkannya dari dunia luar. Mereka harus SELALU dihasilkan dalam prosesor, selama boot. Melakukan hal lain secara instan membatalkan sisanya - secara otomatis tidak aman.

  2. Jangan menyimpan kunci dalam memori nonvolatile, Anda benar dalam hal ini. Tidak masalah jika Anda melindungi EEPROM atau memori flash agar tidak dibaca. Sekring proteksi baca kode itu mudah dibalik. Seorang penyerang hanya perlu memenggal kepala (mengeluarkan atau mengetsa secara kimiawi kemasan epoksi hitam untuk mengekspos silikon mati di dalamnya). Pada titik ini, mereka dapat menutupi bagian cetakan yang merupakan sel memori yang tidak mudah menguap (bagian-bagian ini sangat teratur dan sementara sel-sel memori individu sangat kecil untuk dilihat, struktur yang lebih besar dapat dilihat) dan sebagian kecil dari sesuatu buram ke UV ditutupi bagian itu. Kemudian penyerang hanya bisa menyinari sinar UV pada chip selama 5-10 menit, dan mengatur ulang semua sekering, termasuk sekering CRP. Memori OTP sekarang dapat dibaca oleh programmer standar.

Atau, jika didanai dengan baik (misalnya, mendapatkan kunci itu bernilai lebih dari $ 1000 untuk seseorang), mereka hanya dapat membaca sel memori secara langsung dengan beberapa jenis mikroskop elektron.

Agar aman, kunci harus dihapus, bukan disembunyikan.

  1. Tidak, untuk alasan yang sama di atas.

Sekarang, ke opsi 4:

  1. Cukup gunakan enkripsi. Distribusi kunci adalah masalah yang diselesaikan. Jadi gunakan solusi yang tersedia. Chip harus menggunakan RNG-nya dan berbagai pertimbangan lain harus dibuat untuk memastikan ia memiliki cukup pasokan entropi, dan boot loader harus mem-boot langsung ke dalam program yang menghasilkan kunci rahasia yang diperlukan, yang seharusnya bertujuan umum mendaftar dan pindah langsung ke SRAM, di mana mereka akan tinggal sampai terhapus.

Namun ada masalah, yaitu tidak ada apa-apa selain CPU yang tahu kunci kuncinya. Tidak masalah: gunakan kriptografi kunci publik. Apa yang Anda DO telah disimpan dalam memori OTP adalah kunci publik Anda. Kunci ini dapat dibaca oleh siapa saja, Anda dapat mempostingnya di pertukaran tumpukan, Anda dapat melukisnya di sisi kapal tanker minyak dengan huruf setinggi 5 kaki, tidak masalah. Hal yang luar biasa tentang kriptografi kunci publik adalah asimetris. Kunci untuk mengenkripsi sesuatu tidak dapat mendekripsi, yang memerlukan kunci pribadi. Dan sebaliknya, kunci untuk mendekripsi sesuatu yang dienkripsi oleh kunci publik tidak dapat digunakan untuk mengenkripsi sesuatu. Jadi, CPU membuat kunci rahasia, menggunakan kunci publik Anda yang tersimpan untuk ENCRYPT kunci rahasia, dan cukup mengirimkannya melalui USB atau RS232 atau apa pun yang Anda inginkan. Membaca kunci rahasia memerlukan kunci pribadi Anda, yang tidak perlu disimpan, dikirim, atau pernah terlibat sama sekali dengan chip. Setelah kunci rahasia didekripsi dengan kunci pribadi Anda (di tempat lain, di luar chip), Anda siap. Anda memiliki kunci rahasia yang ditransmisikan secara aman yang DIHASILKAN seluruhnya dalam chip, tanpa harus menyimpan apa pun kecuali kunci publik - yang sebagaimana dinyatakan sebelumnya, tidak perlu dilindungi sama sekali dari pembacaan.

Proses ini secara resmi disebut negosiasi kunci, dan setiap hal menggunakannya. Anda telah menggunakannya beberapa kali hari ini. Ada banyak sumber daya dan perpustakaan yang tersedia untuk menanganinya. Tolong, jangan pernah 'menyuntikkan' kunci apa pun.

Satu hal terakhir yang disebutkan: Semua ini diperdebatkan karena kunci AES dapat dengan mudah dipulihkan dengan menggunakan serangan saluran samping, yang terletak pada catu daya dan mengukur perubahan menit pada undian saat ini dan waktu antara perubahan yang disebabkan oleh bit yang terbalik di CPU. sebagai register. Ini, dikombinasikan dengan pengetahuan tentang bagaimana AES (atau apa pun dari sekian banyak algoritma enkripsi yang mungkin dapat digunakan) bekerja, membuatnya relatif mudah dan murah untuk memulihkan kunci. Itu tidak akan mengizinkan membaca kunci, tetapi dapat mempersempit ruang kunci untuk sesuatu yang sangat kecil, seperti 255 kunci yang mungkin. Chip juga tidak dapat mendeteksinya, karena hulu.

Ini telah mengalahkan boot loader terenkripsi AES-256 pada prosesor crypto 'aman' dan bahkan tidak terlalu sulit. Sejauh yang saya tahu, tidak ada langkah-langkah perangkat keras yang benar untuk serangan ini. Namun, itu adalah algoritma enkripsi itu sendiri, dan bagaimana mereka membutuhkan CPU untuk membalik bit, yang menyebabkan kerentanan ini. Saya menduga bahwa algoritma pembuktian sisi-channel atau side-channel perlu (dan mudah-mudahan) sedang dikembangkan.

Jadi seperti yang ada sekarang, jawaban sebenarnya untuk bagaimana menyimpan kunci (atau bahkan hanya menggunakan kunci sementara) pada perangkat yang tertanam dengan aman adalah: Anda tidak bisa.

Tetapi setidaknya jika Anda menghasilkan kunci baru setiap kali menggunakan negosiasi kunci di opsi 4, maka serangan saluran samping hanya dapat membahayakan kunci saluran yang sedang digunakan, dan hanya jika mereka memiliki waktu untuk memantau daya saat mengenkripsi data . Jika Anda sering menegosiasikan kunci baru yang dihasilkan secara internal, ini dapat memberikan jumlah keamanan yang bermanfaat.

Hasilkan kunci, dan simpan sesingkat mungkin.

metacollin
sumber
Sangat berterima kasih pada Metacollin yang terhormat karena telah menjernihkan saya. Tetapi proyek saya terdiri dari banyak pembaca (berisi MCU) dan banyak MCU target, Setiap pembaca harus dapat membaca salah satu target dan salah satu target harus dapat dibaca oleh salah satu pembaca. Karena ini saya pikir mereka harus setuju dengan kunci unik untuk mengangkut data. dan berdasarkan jawaban Anda saya pikir maka tidak ada begitu banyak perbedaan antara misalnya LPC18S57 korteks m3 aman dan korteks m4 STM32F429 dan bahkan korteks m3 LPC1788 umum (pilihan lebih murah), saya tidak melakukan proyek rahasia tetapi saya ingin melakukan ini seaman mungkin.
Mahmoud Hosseinipour
2
Pernyataan Anda bahwa "kunci AES dapat dengan mudah dipulihkan" setidaknya dipertanyakan. Saya memahami prinsip di balik teknik mencari tahu apa yang terjadi pada prosesor, berdasarkan konsumsi saat ini. Namun, ini mengasumsikan bahwa enkripsi dan dekripsi adalah satu-satunya hal yang cpu bekerja. Namun, sebagian besar aplikasi hanya memiliki 1 cpu yang berfungsi pada banyak tugas dalam waktu bersamaan. Selama satu blok, enkripsi AES dapat terjadi puluhan atau ratusan interupsi yang membuatnya mustahil untuk mengetahui kuncinya, berdasarkan puncak saat ini.
bakcsa83
2
Jika kunci tidak boleh disimpan dalam flash, maka hal yang sama berlaku untuk kode yang menghasilkan kunci ... hanya perlu menerjemahkan kode op ke assembler dan kemudian Anda memiliki kunci, tidak peduli seberapa rumit kodenya.
Lundin
The wonderful thing about private key cryptography is that it is asymmetric. Meskipun jelas dari pos Anda bahwa Anda tahu ini, saya akan menyebutkannya untuk pembaca lain ... s / pribadi / publik dalam kutipan di atas.
Radian
Anda mungkin dapat mengamankan saluran antara dua perangkat apa pun menggunakan metode 4, namun, tanpa memiliki beberapa bentuk rahasia bersama, Anda tidak dapat menjamin keaslian perangkat yang digunakan untuk berkomunikasi. Jika use case Anda memerlukan otentikasi, Anda tidak lebih baik dengan pertukaran kunci daripada Anda jika Anda hanya menyimpan satu rahasia bersama dalam sekejap. Jika Anda membutuhkan keamanan yang lebih baik, chip crypto harus digunakan.
Greg