远程参数加解密

This commit is contained in:
玉峰 2025-08-31 22:59:14 +08:00
parent 3e91855d79
commit f243a3703e
4 changed files with 145 additions and 19 deletions

View File

@ -6,6 +6,9 @@ public class AppSDKManager : MonoBehaviour
{ {
public static AppSDKManager Instance; public static AppSDKManager Instance;
//包名
public const string PackageName = "com.rush.cash.earn.fast.real.money.game";
private void Awake() private void Awake()
{ {
Instance = this; Instance = this;

View File

@ -1,10 +1,9 @@
using System; using System;
using System.Threading.Tasks; using System.Globalization;
using AdjustSdk;
using Firebase;
using Firebase.Extensions; using Firebase.Extensions;
using Firebase.RemoteConfig; using Firebase.RemoteConfig;
using Script.Utils; using Script.Utils;
using SDK.Utils;
using UnityEngine; using UnityEngine;
public class FireBaseRemoteConfigManager : NormalSingleton<FireBaseRemoteConfigManager> public class FireBaseRemoteConfigManager : NormalSingleton<FireBaseRemoteConfigManager>
@ -41,19 +40,17 @@ public class FireBaseRemoteConfigManager : NormalSingleton<FireBaseRemoteConfigM
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="defaultValue"></param> /// <param name="defaultValue"></param>
/// <returns></returns> /// <returns></returns>
public async Task<int> GetRemoteConfigInt(string key, int defaultValue = 0) public int GetRemoteConfigInt(string key, int defaultValue = 0, bool IsEncrypt = false)
{ {
try try
{ {
// await FirebaseRemoteConfig.DefaultInstance.FetchAsync(TimeSpan.Zero); string newKey = GetKey(key, IsEncrypt);
// await FirebaseRemoteConfig.DefaultInstance.ActivateAsync();
// 获取值 // 获取值
var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(key); var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(newKey);
if (configValue.Source == ValueSource.RemoteValue) if (configValue.Source == ValueSource.RemoteValue)
{ {
return (int)configValue.LongValue; return (int)GetValueLong(newKey, configValue);
} }
else else
{ {
@ -74,16 +71,16 @@ public class FireBaseRemoteConfigManager : NormalSingleton<FireBaseRemoteConfigM
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="defaultValue"></param> /// <param name="defaultValue"></param>
/// <returns></returns> /// <returns></returns>
public string GetRemoteConfigString(string key, string defaultValue = "") public string GetRemoteConfigString(string key, string defaultValue = "", bool IsEncrypt = false)
{ {
try try
{ {
string newKey = GetKey(key, IsEncrypt);
// 获取值 // 获取值
var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(key); var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(newKey);
if (configValue.Source == ValueSource.RemoteValue) if (configValue.Source == ValueSource.RemoteValue)
{ {
return configValue.StringValue; return GetValueStr(newKey, configValue);
} }
else else
{ {
@ -104,16 +101,17 @@ public class FireBaseRemoteConfigManager : NormalSingleton<FireBaseRemoteConfigM
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="defaultValue"></param> /// <param name="defaultValue"></param>
/// <returns></returns> /// <returns></returns>
public bool GetRemoteConfigBool(string key, bool defaultValue = false) public bool GetRemoteConfigBool(string key, bool defaultValue = false, bool IsEncrypt = false)
{ {
try try
{ {
string newKey = GetKey(key, IsEncrypt);
// 获取值 // 获取值
var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(key); var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(newKey);
if (configValue.Source == ValueSource.RemoteValue) if (configValue.Source == ValueSource.RemoteValue)
{ {
return configValue.BooleanValue; return GetValueBool(newKey, configValue);
} }
else else
{ {
@ -134,16 +132,17 @@ public class FireBaseRemoteConfigManager : NormalSingleton<FireBaseRemoteConfigM
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="defaultValue"></param> /// <param name="defaultValue"></param>
/// <returns></returns> /// <returns></returns>
public float GetRemoteConfigBool(string key, float defaultValue = 0) public float GetRemoteConfigBool(string key, float defaultValue = 0, bool IsEncrypt = false)
{ {
try try
{ {
string newKey = GetKey(key, IsEncrypt);
// 获取值 // 获取值
var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(key); var configValue = FirebaseRemoteConfig.DefaultInstance.GetValue(newKey);
if (configValue.Source == ValueSource.RemoteValue) if (configValue.Source == ValueSource.RemoteValue)
{ {
return (float)configValue.DoubleValue; return (float)GetValueDouble(newKey, configValue);
} }
else else
{ {
@ -157,4 +156,48 @@ public class FireBaseRemoteConfigManager : NormalSingleton<FireBaseRemoteConfigM
} }
} }
/// <summary>
/// 是否是加密
/// </summary>
/// <returns></returns>
private bool IsEncrypt(string key)
{
return key.StartsWith("CCB", StringComparison.OrdinalIgnoreCase);
}
private string GetKey(string key, bool isEncrypt)
{
//ccb开头 忽略大小写
return isEncrypt ? $"ccb{EncryptionUtils.AesEncrypt(AppSDKManager.PackageName, key)}" : key;
}
private string GetValueStr(string key, ConfigValue configValue)
{
return IsEncrypt(key) ? EncryptionUtils.AesDecrypt(AppSDKManager.PackageName, configValue.StringValue) : configValue.StringValue;
}
private long GetValueLong(string key, ConfigValue configValue)
{
return IsEncrypt(key) ? long.Parse(EncryptionUtils.AesDecrypt(AppSDKManager.PackageName, configValue.StringValue)) : configValue.LongValue;
}
private bool GetValueBool(string key, ConfigValue configValue)
{
return IsEncrypt(key) ? bool.Parse(EncryptionUtils.AesDecrypt(AppSDKManager.PackageName, configValue.StringValue)) : configValue.BooleanValue;
}
private double GetValueDouble(string key, ConfigValue configValue)
{
if (IsEncrypt(key))
{
string valueStr = EncryptionUtils.AesDecrypt(AppSDKManager.PackageName, configValue.StringValue);
if (float.TryParse(valueStr, NumberStyles.Float, CultureInfo.InvariantCulture, out float result))
{
return result;
}
}
return configValue.DoubleValue;
}
} }

View File

@ -0,0 +1,69 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
namespace SDK.Utils
{
public static class EncryptionUtils
{
private static string GetKey(string packageName)
{
var keyBytes = Encoding.UTF8.GetBytes(packageName);
byte[] keyHash;
using (var md5 = MD5.Create())
{
keyHash = md5.ComputeHash(keyBytes);
}
return BitConverter.ToString(keyHash).Replace("-", "").ToUpper();
}
// Aes 加密
public static string AesEncrypt(string packageName, string content)
{
string key = GetKey(packageName);
var contentBytes = Encoding.UTF8.GetBytes(content);
var keyBytes = Encoding.UTF8.GetBytes(key);
byte[] keyHash;
using (var md5 = MD5.Create())
{
keyHash = md5.ComputeHash(keyBytes);
}
using var aesAlg = Aes.Create();
aesAlg.Key = keyHash;
aesAlg.Mode = CipherMode.ECB;
aesAlg.Padding = PaddingMode.PKCS7;
var encryptor = aesAlg.CreateEncryptor();
var encryptedBytes = encryptor.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
return BitConverter.ToString(encryptedBytes).Replace("-", "").ToLower();
}
// Aes 解密
public static string AesDecrypt(string packageName, string encrypted)
{
string key = GetKey(packageName);
var keyBytes = Encoding.UTF8.GetBytes(key);
var encryptedBytes = new byte[encrypted.Length / 2];
for (var i = 0; i < encryptedBytes.Length; i++)
{
encryptedBytes[i] = Convert.ToByte(encrypted.Substring(i * 2, 2), 16);
}
// 使用传统的MD5创建方式
byte[] keyHash;
using (var md5 = MD5.Create())
{
keyHash = md5.ComputeHash(keyBytes);
}
using var aesAlg = Aes.Create();
aesAlg.Key = keyHash;
aesAlg.Mode = CipherMode.ECB;
aesAlg.Padding = PaddingMode.PKCS7;
var decryptor = aesAlg.CreateDecryptor();
var decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
return Encoding.UTF8.GetString(decryptedBytes);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3073440da29b60344965c2aebf6ead1a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: