using System.Security.Cryptography; using System.Text; namespace MP.MONO.Core { /// /// Classe validazione valori /// public class MachineDataValidator { #region Public Constructors /// /// Init classe validatore /// /// public MachineDataValidator() { // inizializzo info di base if (machTestData == null || machTestData.Count == 0) { machTestData = setupData().Result; } } #endregion Public Constructors #region Public Properties /// /// Restituisce HASH del codice impiego = payload utente /// /// public string macHash { get => calcMachineHash(); } #endregion Public Properties #region Public Methods #if false /// /// Verifica validità info correnti /// /// public async Task testCurrInfo() { return await testInfo(); } #endif /// /// Verifica validità info correnti /// /// public static async Task testCurrInfo() { var cDV = new MachineDataValidator(); return await cDV.testInfo(); } #endregion Public Methods #region Private Fields /// /// Dati rispetto cui fare i calcoli di validazione /// private static Dictionary machTestData = new Dictionary(); #endregion Private Fields #region Private Methods /// /// Calcola HASH del codice impiego = payload utente /// /// private string calcMachineHash() { string hash = ""; string buffData = currBaseBuffer(); if (!string.IsNullOrEmpty(buffData)) { // hashing! using (var hAlgo = SHA512.Create()) //using (var hAlgo = MD5.Create()) { byte[] InputBytes = Encoding.UTF8.GetBytes(buffData); var byteHash = hAlgo.ComputeHash(InputBytes); hash = BitConverter.ToString(byteHash).Replace("-", "").Replace("/", "").Replace("\\", "").ToLowerInvariant(); } } return hash; } /// /// Calcola hash key da info PC /// /// private string currBaseBuffer() { string answ = "????????????????????????????????????????????"; StringBuilder sb = new StringBuilder(); try { // calcolo hashKey da alcuni valori solamente sb.Append($"{machTestData["SystemName"]}|"); sb.Append($"{machTestData["ProcessorId"]}|"); sb.Append($"{machTestData["PartNumber"]}|"); sb.Append($"{machTestData["MACAddress"]}|"); sb.Append($"{machTestData["SerialNumber"]}|"); sb.Append($"{machTestData["OSArchitecture"]}|"); sb.Append($"{machTestData["SoftwareElementID"]}|"); sb.Append($"{machTestData["SystemBiosMajorVersion"]}|"); sb.Append($"{machTestData["SystemBiosMinorVersion"]}|"); sb.Append($"{machTestData["CpuVersion"]}|"); sb.Append($"{machTestData["BiosVersion"]}|"); if (sb.Length > 0) { answ = sb.ToString(); // lo uso 2 volte dritto e reverse... answ += ReverseString(sb.ToString()); } } catch { } return answ; } /// /// Esegue reverse delal stringa /// /// /// private string ReverseString(string myStr) { char[] myArr = myStr.ToCharArray(); Array.Reverse(myArr); return new string(myArr); } /// /// Legge la hash key dal file licenza salvato /// /// /// private async Task getSavedHash() { string answ = "############################################################"; string filePath = "Conf/lic.file"; if (File.Exists(filePath)) { answ = await File.ReadAllTextAsync(filePath); } return answ; } public static Dictionary biosInfo = new Dictionary(); public static Dictionary cpuInfo = new Dictionary(); public static Dictionary netInfo = new Dictionary(); public static Dictionary osInfo = new Dictionary(); public static Dictionary ramInfo = new Dictionary(); /// /// Predispone elenco dati di test /// /// private async Task> setupData() { // creo un unico array di info Dictionary testData = new Dictionary(); biosInfo = await MachineInfo.GetInfo("BIOS"); cpuInfo = await MachineInfo.GetInfo("CPU"); netInfo = await MachineInfo.GetInfo("NET"); osInfo = await MachineInfo.GetInfo("OS"); ramInfo = await MachineInfo.GetInfo("RAM"); testData = biosInfo.Concat(cpuInfo).Concat(netInfo).Concat(osInfo).Concat(ramInfo).GroupBy(ele => ele.Key).ToDictionary(ele => ele.Key, ele => ele.First().Value); return testData; } /// /// Effettua verifica putuale tra hash Key fornita ed hash key calcolata da info PC /// /// private async Task testInfo() { // recupero hash key da conf applicativo (licenza) string fileHash = await getSavedHash(); /// recupero hash calcolata string calcHash = calcMachineHash(); // confronto con hashKey calcolata da info PC + dati... return fileHash.Equals(calcHash); } #endregion Private Methods } }