DataStorage.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net.NetworkInformation;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using TapSDK.Core.Internal.Log;
  8. using UnityEngine;
  9. namespace TapSDK.Core
  10. {
  11. public static class DataStorage
  12. {
  13. private static Dictionary<string, string> dataCache;
  14. private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
  15. public static void SaveString(string key, string value)
  16. {
  17. string storageKey = GenerateStorageKey(key);
  18. SaveStringToCache(storageKey, value);
  19. string encodeValue = EncodeString(value);
  20. PlayerPrefs.SetString(storageKey, encodeValue);
  21. }
  22. public static string LoadString(string key)
  23. {
  24. string storageKey = GenerateStorageKey(key);
  25. string value = LoadStringFromCache(storageKey);
  26. if (!string.IsNullOrEmpty(value))
  27. {
  28. return value;
  29. }
  30. value = PlayerPrefs.HasKey(storageKey) ? DecodeString(PlayerPrefs.GetString(storageKey)) : null;
  31. // 尝试从本地获取旧版本数据
  32. if (value == null)
  33. {
  34. value = PlayerPrefs.HasKey(key) ? DecodeString(PlayerPrefs.GetString(key)) : null;
  35. // 旧版本存在有效数据时,转储为新的 storageKey
  36. if (value != null)
  37. {
  38. PlayerPrefs.SetString(storageKey, EncodeString(value));
  39. PlayerPrefs.DeleteKey(key);
  40. }
  41. }
  42. if (value != null)
  43. {
  44. SaveStringToCache(storageKey, value);
  45. }
  46. return value;
  47. }
  48. public static void RemoveCacheKey(string key)
  49. {
  50. if (!string.IsNullOrEmpty(key))
  51. {
  52. PlayerPrefs.DeleteKey(key);
  53. PlayerPrefs.DeleteKey(GenerateStorageKey(key));
  54. }
  55. }
  56. private static void SaveStringToCache(string key, string value)
  57. {
  58. if (dataCache == null)
  59. {
  60. dataCache = new Dictionary<string, string>();
  61. }
  62. if (dataCache.ContainsKey(key))
  63. {
  64. dataCache[key] = value;
  65. }
  66. else
  67. {
  68. dataCache.Add(key, value);
  69. }
  70. }
  71. private static string LoadStringFromCache(string key)
  72. {
  73. if (dataCache == null)
  74. {
  75. dataCache = new Dictionary<string, string>();
  76. }
  77. return dataCache.ContainsKey(key) ? dataCache[key] : null;
  78. }
  79. private static string EncodeString(string encryptString)
  80. {
  81. if (Platform.IsAndroid() || Platform.IsIOS())
  82. {
  83. return encryptString;
  84. }
  85. try
  86. {
  87. byte[] rgbKey = Encoding.UTF8.GetBytes(GetMacAddress().Substring(0, 8));
  88. byte[] rgbIV = Keys;
  89. byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
  90. DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
  91. MemoryStream mStream = new MemoryStream();
  92. CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
  93. cStream.Write(inputByteArray, 0, inputByteArray.Length);
  94. cStream.FlushFinalBlock();
  95. cStream.Close();
  96. return Convert.ToBase64String(mStream.ToArray());
  97. }
  98. catch
  99. {
  100. return encryptString;
  101. }
  102. }
  103. private static string DecodeString(string decryptString)
  104. {
  105. if (Platform.IsAndroid() || Platform.IsIOS())
  106. {
  107. return decryptString;
  108. }
  109. try
  110. {
  111. byte[] rgbKey = Encoding.UTF8.GetBytes(GetMacAddress().Substring(0, 8));
  112. byte[] rgbIV = Keys;
  113. byte[] inputByteArray = Convert.FromBase64String(decryptString);
  114. DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
  115. MemoryStream mStream = new MemoryStream();
  116. CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
  117. cStream.Write(inputByteArray, 0, inputByteArray.Length);
  118. cStream.FlushFinalBlock();
  119. cStream.Close();
  120. return Encoding.UTF8.GetString(mStream.ToArray());
  121. }
  122. catch (Exception e)
  123. {
  124. TapLog.Log(e.Message);
  125. return decryptString;
  126. }
  127. }
  128. private static string GetMacAddress()
  129. {
  130. string physicalAddress = "FFFFFFFFFFFF";
  131. if (Platform.IsAndroid() || Platform.IsIOS())
  132. {
  133. return physicalAddress;
  134. }
  135. NetworkInterface[] nice = NetworkInterface.GetAllNetworkInterfaces();
  136. foreach (NetworkInterface adaper in nice)
  137. {
  138. if (adaper.Description == "en0")
  139. {
  140. physicalAddress = adaper.GetPhysicalAddress().ToString();
  141. break;
  142. }
  143. else
  144. {
  145. physicalAddress = adaper.GetPhysicalAddress().ToString();
  146. if (physicalAddress != "")
  147. {
  148. break;
  149. };
  150. }
  151. }
  152. return physicalAddress;
  153. }
  154. // 生成存储在本地文件中 key
  155. private static string GenerateStorageKey(string originKey){
  156. if(TapTapSDK.taptapSdkOptions != null && !string.IsNullOrEmpty(TapTapSDK.taptapSdkOptions.clientId)){
  157. return originKey + "_" + TapTapSDK.taptapSdkOptions.clientId;
  158. }
  159. return originKey;
  160. }
  161. }
  162. }