1,开始采用了guid 来解决问题,但是在EF中,要是直接返回guid的话,因为不能解密,所以得去数据库中先查后改,这是常规的方式,但是为了效率,不想查询,那就不好修改了
2,现在想的是将id可逆加解密,将加密后的ID进行传输 想的是DES之类的方法,但对加解密不太熟悉
3,请问现在有没有比较方便的 将 整数 ID 可逆 加解密 的 比较好的方法
id肯定优先整型,guid做id效率不是很多个倍数。
至于数据安全https才能优雅解决。des直接就放弃,自己写rsa就是浪费。
安全不是主要考虑的,主要是避免数据被恶意篡改,被批量破坏,比如直接整数的话,别人很容易用程序来不断的刷,导致一些问题
如果用 .NET Core ,加解密则非常简单(而且是非对称加密),加密用 IDataProtector.Protect()
,解密用 IDataProtector.Unprotect()
写个des或者aes有这么费劲吗?
随便弄个函数加密解密就行啦
根据ID加密
public static string CreateCode(int uid)
{
lock (codeLock)
{
//十进制转十六进制
string hexid = Convert.ToString(uid, 16);
//高位补零
string str = "";
for (int i = len / 2; i > hexid.Length; i--)
{
str += "0";
}
str += hexid;
//插入随机字符
Random ran = new Random();
for (int i = 1; i < str.Length + 1; i += 2)
{
str = str.Insert(i, sourcecode.Substring(ran.Next(0, sourcecode.Length - 1), 1));
}
return str;
}
}
解密
public static int Decode(string code)
{
lock (codeLock)
{
//提取用户id
string str = "";
int uid;
for (int i = 0; i < code.Length; i += 2)
{
str += code.Substring(i, 1);
}
//剔除高位零
for (int i = 0; i < str.Length; i++)
{
if (!str.Substring(i, 1).Equals("0"))
{
str = str.Substring(i, str.Length - i);
break;
}
}
uid = Convert.ToInt32(str, 16);
return uid;
}
}
C# 直接有加密的函数,用base64应该就可以了
服务端拼url的时候,对Id进行加密,然后输出到客户端的时候显示的就是加密后的Id;
用户点击url请求到服务端的时候进行解密;
反正加密,解密都在你的服务器端,你想怎么弄就怎么弄。
别在Id来实现这个功能,业务数据参数还是要保持不变,这个可以使用token来解决,比如JWT,JWT本身就是加密的,同时服务端可以验证的
AES加密
/// <summary>
/// AES加密
/// </summary>
/// <param name="str">加密字符</param>
/// <param name="key">加密的密码</param>
/// <returns></returns>
public string AESEncrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = System.Security.Cryptography.CipherMode.ECB,
Padding = System.Security.Cryptography.PaddingMode.PKCS7,
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="text"></param>
/// <param name="password"></param>
/// <returns></returns>
public string AESDecrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Convert.FromBase64String(str);
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = System.Security.Cryptography.CipherMode.ECB,
Padding = System.Security.Cryptography.PaddingMode.PKCS7
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
key需要时16位