encryption.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * 高级加密与解密工具
  3. * 提供字符串和对象的加密解密功能
  4. */
  5. // 密钥(生产环境应更换为强密钥)
  6. const DEFAULT_KEY = 'mengchuangPlanet2025';
  7. /**
  8. * 简单的字符串加密
  9. * @param {String} str - 要加密的字符串
  10. * @param {String} key - 加密密钥(可选)
  11. * @returns {String} - 加密后的字符串
  12. */
  13. export function encryptString(str, key = DEFAULT_KEY) {
  14. if (!str) return '';
  15. try {
  16. // 生成密钥字节序列
  17. const keyBytes = generateKeyBytes(key);
  18. // 加密
  19. let encrypted = '';
  20. for (let i = 0; i < str.length; i++) {
  21. const charCode = str.charCodeAt(i);
  22. const keyByte = keyBytes[i % keyBytes.length];
  23. encrypted += String.fromCharCode(charCode ^ keyByte);
  24. }
  25. // Base64编码
  26. return btoa(encrypted);
  27. } catch (e) {
  28. console.error('字符串加密失败:', e);
  29. return '';
  30. }
  31. }
  32. /**
  33. * 解密字符串
  34. * @param {String} encryptedStr - 加密后的字符串
  35. * @param {String} key - 解密密钥(需与加密密钥相同)
  36. * @returns {String} - 解密后的字符串
  37. */
  38. export function decryptString(encryptedStr, key = DEFAULT_KEY) {
  39. if (!encryptedStr) return '';
  40. try {
  41. // Base64解码
  42. const encrypted = atob(encryptedStr);
  43. // 生成密钥字节序列
  44. const keyBytes = generateKeyBytes(key);
  45. // 解密
  46. let decrypted = '';
  47. for (let i = 0; i < encrypted.length; i++) {
  48. const charCode = encrypted.charCodeAt(i);
  49. const keyByte = keyBytes[i % keyBytes.length];
  50. decrypted += String.fromCharCode(charCode ^ keyByte);
  51. }
  52. return decrypted;
  53. } catch (e) {
  54. console.error('字符串解密失败:', e);
  55. return '';
  56. }
  57. }
  58. /**
  59. * 加密对象
  60. * @param {Object} obj - 要加密的对象
  61. * @param {String} key - 加密密钥(可选)
  62. * @returns {String} - 加密后的字符串
  63. */
  64. export function encryptObject(obj, key = DEFAULT_KEY) {
  65. if (!obj) return '';
  66. try {
  67. // 将对象转为JSON字符串
  68. const jsonStr = JSON.stringify(obj);
  69. // 加密JSON字符串
  70. return encryptString(jsonStr, key);
  71. } catch (e) {
  72. console.error('对象加密失败:', e);
  73. return '';
  74. }
  75. }
  76. /**
  77. * 解密对象
  78. * @param {String} encryptedStr - 加密后的字符串
  79. * @param {String} key - 解密密钥(需与加密密钥相同)
  80. * @returns {Object|null} - 解密后的对象,失败返回null
  81. */
  82. export function decryptObject(encryptedStr, key = DEFAULT_KEY) {
  83. if (!encryptedStr) return null;
  84. try {
  85. // 解密JSON字符串
  86. const jsonStr = decryptString(encryptedStr, key);
  87. // 解析JSON
  88. return JSON.parse(jsonStr);
  89. } catch (e) {
  90. console.error('对象解密失败:', e);
  91. return null;
  92. }
  93. }
  94. /**
  95. * 生成安全的URL参数
  96. * @param {Object} params - 参数对象
  97. * @param {String} key - 加密密钥(可选)
  98. * @returns {String} - 加密后的URL参数字符串
  99. */
  100. export function generateSecureUrlParams(params, key = DEFAULT_KEY) {
  101. if (!params) return '';
  102. try {
  103. // 加密对象
  104. const encrypted = encryptObject(params, key);
  105. // URL安全编码
  106. return encodeURIComponent(encrypted);
  107. } catch (e) {
  108. console.error('URL参数加密失败:', e);
  109. return '';
  110. }
  111. }
  112. /**
  113. * 解析安全的URL参数
  114. * @param {String} encryptedParams - 加密的URL参数字符串
  115. * @param {String} key - 解密密钥(需与加密密钥相同)
  116. * @returns {Object|null} - 解密后的参数对象
  117. */
  118. export function parseSecureUrlParams(encryptedParams, key = DEFAULT_KEY) {
  119. if (!encryptedParams) return null;
  120. try {
  121. // URL解码
  122. const decoded = decodeURIComponent(encryptedParams);
  123. // 解密对象
  124. return decryptObject(decoded, key);
  125. } catch (e) {
  126. console.error('URL参数解密失败:', e);
  127. return null;
  128. }
  129. }
  130. /**
  131. * 生成密钥的字节序列
  132. * @param {String} key - 密钥
  133. * @returns {Array} - 字节序列
  134. * @private
  135. */
  136. function generateKeyBytes(key) {
  137. const bytes = [];
  138. for (let i = 0; i < key.length; i++) {
  139. bytes.push(key.charCodeAt(i));
  140. }
  141. return bytes;
  142. }
  143. /**
  144. * 生成随机密钥
  145. * @param {Number} length - 密钥长度
  146. * @returns {String} - 随机密钥
  147. */
  148. export function generateRandomKey(length = 32) {
  149. const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  150. let result = '';
  151. for (let i = 0; i < length; i++) {
  152. result += chars.charAt(Math.floor(Math.random() * chars.length));
  153. }
  154. return result;
  155. }
  156. /**
  157. * 使用随机盐值加密敏感数据
  158. * @param {String} data - 要加密的数据
  159. * @param {String} key - 加密密钥(可选)
  160. * @returns {Object} - 包含加密数据和盐值的对象
  161. */
  162. export function encryptWithSalt(data, key = DEFAULT_KEY) {
  163. // 生成随机盐值
  164. const salt = generateRandomKey(16);
  165. // 使用盐值和密钥加密
  166. const encrypted = encryptString(data, salt + key);
  167. return {
  168. data: encrypted,
  169. salt: salt
  170. };
  171. }
  172. /**
  173. * 使用盐值解密数据
  174. * @param {String} encryptedData - 加密后的数据
  175. * @param {String} salt - 盐值
  176. * @param {String} key - 解密密钥(可选)
  177. * @returns {String} - 解密后的数据
  178. */
  179. export function decryptWithSalt(encryptedData, salt, key = DEFAULT_KEY) {
  180. return decryptString(encryptedData, salt + key);
  181. }
  182. export default {
  183. encryptString,
  184. decryptString,
  185. encryptObject,
  186. decryptObject,
  187. generateSecureUrlParams,
  188. parseSecureUrlParams,
  189. generateRandomKey,
  190. encryptWithSalt,
  191. decryptWithSalt
  192. }