首页 新闻 会员 周边 捐助

c# URL或者数据传输中 id 现在常用的加密方式(避免乱改乱调数据)

0
悬赏园豆:50 [待解决问题]

1,开始采用了guid 来解决问题,但是在EF中,要是直接返回guid的话,因为不能解密,所以得去数据库中先查后改,这是常规的方式,但是为了效率,不想查询,那就不好修改了
2,现在想的是将id可逆加解密,将加密后的ID进行传输 想的是DES之类的方法,但对加解密不太熟悉
3,请问现在有没有比较方便的 将 整数 ID 可逆 加解密 的 比较好的方法

静下来的颜色的主页 静下来的颜色 | 初学一级 | 园豆:5
提问于:2018-11-16 19:37
< >
分享
所有回答(8)
0

id肯定优先整型,guid做id效率不是很多个倍数。
至于数据安全https才能优雅解决。des直接就放弃,自己写rsa就是浪费。

花飘水流兮 | 园豆:13615 (专家六级) | 2018-11-16 20:15

安全不是主要考虑的,主要是避免数据被恶意篡改,被批量破坏,比如直接整数的话,别人很容易用程序来不断的刷,导致一些问题

支持(0) 反对(0) 静下来的颜色 | 园豆:5 (初学一级) | 2018-11-16 20:22
0

如果用 .NET Core ,加解密则非常简单(而且是非对称加密),加密用 IDataProtector.Protect() ,解密用 IDataProtector.Unprotect()

dudu | 园豆:30925 (高人七级) | 2018-11-16 21:12
0

写个des或者aes有这么费劲吗?

梦里的畅泳 | 园豆:159 (初学一级) | 2018-11-17 08:45
0

随便弄个函数加密解密就行啦
根据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;
        }
    }
永恒921 | 园豆:212 (菜鸟二级) | 2018-11-20 14:31
0

C# 直接有加密的函数,用base64应该就可以了

jqw2009 | 园豆:2341 (老鸟四级) | 2018-11-20 15:54
0

服务端拼url的时候,对Id进行加密,然后输出到客户端的时候显示的就是加密后的Id;
用户点击url请求到服务端的时候进行解密;

反正加密,解密都在你的服务器端,你想怎么弄就怎么弄。

荆棘人 | 园豆:410 (菜鸟二级) | 2018-11-20 19:18
0

别在Id来实现这个功能,业务数据参数还是要保持不变,这个可以使用token来解决,比如JWT,JWT本身就是加密的,同时服务端可以验证的

jiulang | 园豆:437 (菜鸟二级) | 2018-11-21 23:31
0

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位

chester·chen | 园豆:507 (小虾三级) | 2018-11-23 10:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册