Session

RSA解密实体

电脑版发表于:2023/4/25 15:21

前言

衔接上一篇文章,在配置好加解密之后,我从配置文件直接映射的实体到代码里,里面的属性含有加密数据,也可能传递一个List。我需要对传递过来的对象属性进行解密并返回。
下边来上代码


解密实体中所有属性,并重新赋值

        /// <summary>
        /// 遍历对象属性,尝试进行解密,失败则原样返回
        /// </summary>
        /// <typeparam name="T">List或者实体</typeparam>
        /// <param name="model"></param>
        /// <returns></returns>
        public static T ForeachClassProperties<T>(T model) where T : class, new()
        {
            try
            {
                string privateKey = RSAHelper.GetPrivateKey();

                Type t = model.GetType();
                PropertyInfo[] propertyList = t.GetProperties();
                //除开list
                if (t.Name.IndexOf("List`", StringComparison.Ordinal) < 0)
                {
                    foreach (PropertyInfo item in propertyList)
                    {
                        if (item.PropertyType.Name == "String")
                        {
                            if (item.CanWrite == true && item.PropertyType == typeof(string))
                            {
                                var value = item.GetValue(model) ?? "";
                                if (value.IsNullOrEmpty())
                                {
                                    continue;
                                }

                                try
                                {
                                    item.SetValue(model, RSAHelper.Decrypt(privateKey, value.ToString()));
                                }
                                catch (Exception e)
                                {
                                    continue;
                                }
                            }
                        }
                    }
                }
                else
                {
                    //获取
                    var instanceName = propertyList[2].PropertyType.Name;
                    var namespaceName = propertyList[2].PropertyType.Namespace;
                    Assembly assembly = propertyList[2].PropertyType.Assembly;
                    //Assembly.Load($"{namespaceName.Split('.')[0]}.{namespaceName.Split('.')[1]}");//加载程序集
                    Type type = propertyList[2].PropertyType;
                    //assembly.GetType(namespaceName + "." + instanceName);

                    Type listType = typeof(List<>);
                    //指定泛型的具体类型
                    Type newType = listType.MakeGenericType(new Type[] { type });
                    dynamic list = Activator.CreateInstance(newType, model);
                    foreach (var item in list)
                    {
                        propertyList = item.GetType().GetProperties();
                        foreach (PropertyInfo item1 in propertyList)
                        {
                            if (item1.CanWrite == true && item1.PropertyType == typeof(string))
                            {
                                object value = item1.GetValue(item) ?? "";
                                if (value.IsNullOrEmpty())
                                {
                                    continue;
                                }
                                try
                                {
                                    item1.SetValue(item, RSAHelper.Decrypt(privateKey, value.ToString()));
                                }
                                catch (Exception e)
                                {
                                    continue;
                                }
                            }
                        }
                    }
                    model = list;
                }
                return model;
            }
            catch (Exception e)
            {
                return model;
            }
        }


关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢