String tujuan di ASP.NET Core
Komponen yang digunakan IDataProtectionProvider
harus meneruskan parameter tujuan unik ke CreateProtector
metode . Parameter tujuan melekat pada keamanan sistem perlindungan data, karena menyediakan isolasi antara konsumen kriptografi, bahkan jika kunci kriptografi akar sama.
Ketika konsumen menentukan tujuan, string tujuan digunakan bersama dengan kunci kriptografi akar untuk mendapatkan subkunci kriptografi yang unik untuk konsumen tersebut. Ini mengisolasi konsumen dari semua konsumen kriptografi lainnya dalam aplikasi: tidak ada komponen lain yang dapat membaca payloadnya, dan tidak dapat membaca payload komponen lain. Isolasi ini juga merender seluruh kategori serangan yang tidak layak terhadap komponen.
Dalam diagram di atas, IDataProtector
instans A dan B tidak dapat membaca payload satu sama lain, hanya milik mereka sendiri.
String tujuan tidak harus rahasia. Seharusnya hanya unik dalam arti bahwa tidak ada komponen berperilaku baik lainnya yang akan memberikan string tujuan yang sama.
Tip
Menggunakan namespace layanan dan nama jenis komponen yang menggunakan API perlindungan data adalah aturan praktis yang baik, karena dalam praktiknya informasi ini tidak akan pernah bertentangan.
Komponen yang ditulis Contoso yang bertanggung jawab untuk menambang token pembawa mungkin menggunakan Contoso.Security.BearerToken sebagai string tujuannya. Atau - bahkan lebih baik - mungkin menggunakan Contoso.Security.BearerToken.v1 sebagai string tujuannya. Menambahkan nomor versi memungkinkan versi mendatang untuk menggunakan Contoso.Security.BearerToken.v2 sebagai tujuannya, dan versi yang berbeda akan sepenuhnya terisolasi satu sama lain sejauh payload pergi.
Karena parameter tujuan adalah CreateProtector
array string, yang di atas bisa saja ditentukan sebagai [ "Contoso.Security.BearerToken", "v1" ]
. Hal ini memungkinkan pembentukan hierarki tujuan dan membuka kemungkinan skenario multi-penyewaan dengan sistem perlindungan data.
Peringatan
Komponen tidak boleh mengizinkan input pengguna yang tidak tepercaya menjadi satu-satunya sumber input untuk rantai tujuan.
Misalnya, pertimbangkan komponen Contoso.Messaging.SecureMessage yang bertanggung jawab untuk menyimpan pesan aman. Jika komponen olahpesan aman memanggil CreateProtector([ username ])
, maka pengguna berbahaya mungkin membuat akun dengan nama pengguna "Contoso.Security.BearerToken" dalam upaya untuk mendapatkan komponen untuk memanggil CreateProtector([ "Contoso.Security.BearerToken" ])
, sehingga secara tidak sengaja menyebabkan sistem olahpesan aman untuk memangkas payload yang dapat dianggap sebagai token autentikasi.
Rantai tujuan yang lebih baik untuk komponen olahpesan adalah CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ])
, yang menyediakan isolasi yang tepat.
Isolasi yang disediakan oleh dan perilaku IDataProtectionProvider
, , IDataProtector
dan tujuannya adalah sebagai berikut:
Untuk objek tertentu
IDataProtectionProvider
,CreateProtector
metode akan membuat objek yangIDataProtector
secara unik terkaitIDataProtectionProvider
dengan objek yang membuatnya dan parameter tujuan yang diteruskan ke dalam metode .Parameter tujuan tidak boleh null. (Jika tujuan ditentukan sebagai array, ini berarti bahwa array tidak boleh memiliki panjang nol dan semua elemen array harus non-null.) Tujuan string kosong secara teknis diizinkan tetapi tidak disarankan.
Argumen dua tujuan setara jika dan hanya jika berisi string yang sama (menggunakan perbandingan ordinal) dalam urutan yang sama. Argumen tujuan tunggal setara dengan array tujuan elemen tunggal yang sesuai.
Dua
IDataProtector
objek setara jika dan hanya jika dibuat dari objek yang setaraIDataProtectionProvider
dengan parameter tujuan yang setara.Untuk objek tertentu
IDataProtector
, panggilan keUnprotect(protectedData)
akan mengembalikan yang asliunprotectedData
jika dan hanya jikaprotectedData := Protect(unprotectedData)
untuk objek yang setaraIDataProtector
.
Catatan
Kami tidak mempertimbangkan kasus di mana beberapa komponen sengaja memilih string tujuan yang diketahui bertentangan dengan komponen lain. Komponen seperti itu pada dasarnya akan dianggap berbahaya, dan sistem ini tidak dimaksudkan untuk memberikan jaminan keamanan jika kode berbahaya sudah berjalan di dalam proses pekerja.
ASP.NET Core