Beispiel #1
0
 public async Task StartAsync(Action <int, string> callback, string path, EnumCMD cmd, string connStr)
 {
     await Task.Factory.StartNew(() =>
     {
         Start(callback, path, cmd, connStr);
     });
 }
Beispiel #2
0
        private void ExecuteSql(string sqlEmcryptColumn, EnumCMD cmd, string connStr = "", string path = "")
        {
            if (string.IsNullOrWhiteSpace(sqlEmcryptColumn))
            {
                return;
            }
            Stopwatch sw = new Stopwatch();

            sw.Start();
            try
            {
                if (cmd == EnumCMD.EncryptToDatabase || cmd == EnumCMD.DecryptToDataBase)
                {
                    LogHelper.CommLogger.Info("开始执行到数据库……");
                    int result = MySqlHelper.ExecuteNonQuery(connStr, sqlEmcryptColumn);
                    LogHelper.CommLogger.Info($"执行到数据库成功:{result},耗时:{sw.ElapsedMilliseconds}");
                }
                else
                {
                    LogHelper.CommLogger.Info("开始写入到脚本……");
                    WriteSql(sqlEmcryptColumn, cmd, path);
                    LogHelper.CommLogger.Info($"执行写入到脚本完成,耗时:{sw.ElapsedMilliseconds}");
                }
            }
            catch (Exception ex)
            {
                LogHelper.CommLogger.Error($"ExecuteSql出现错误:{ex}");
            }
            finally
            {
                sw.Stop();
            }
        }
Beispiel #3
0
 /// <summary>
 /// 生成脚本文件
 /// </summary>
 /// <param name="msg"></param>
 /// <param name="cmd"></param>
 /// <param name="path"></param>
 public void WriteSql(string msg, EnumCMD cmd, string path)
 {
     try
     {
         FileStream   fs = new FileStream(path, FileMode.Append);
         StreamWriter sw = new StreamWriter(fs);
         sw.WriteLine(msg);
         sw.Flush();
         sw.Close();
         fs.Close();
     }
     catch (Exception ex)
     {
         LogHelper.CommLogger.Info($"生成脚本文件出错:{ex.Message}");
     }
 }
Beispiel #4
0
 /// <summary>
 /// 图片加密
 /// </summary>
 /// <param name="paths"></param>
 /// <param name="cmd"></param>
 /// <param name="each"></param>
 /// <param name="callback"></param>
 public void ImgEncrypt(string[] paths, EnumCMD cmd, int each = 90, Action <int, string> callback = null)
 {
     foreach (var path in paths)
     {
         byte[] fileContents = new byte[0];
         var    result       = new byte[0];
         try
         {
             LogHelper.CommLogger.Info($"开始加密图片:{path}");
             using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
             {
                 fileContents = new byte[fs.Length];
                 fs.Read(fileContents, 0, fileContents.Length);
             }
             if (cmd == EnumCMD.EncryptFile || cmd == EnumCMD.EncryptFileOneKey)
             {
                 result = JieShun.Udf.Core.UdfEncrypt.SM4EncryptBinary(fileContents);
             }
             else if (cmd == EnumCMD.DecryptFile || cmd == EnumCMD.DecryptFileOneKey)
             {
                 result = JieShun.Udf.Core.UdfEncrypt.SM4DecryptBinary(fileContents);
             }
             if (File.Exists(path))
             {
                 File.Delete(path);
             }
             using (FileStream fs = new FileStream(path, FileMode.CreateNew))
             {
                 fs.Write(result, 0, result.Length);
             }
             LogHelper.CommLogger.Info($"加密图片完成:{path}");
         }
         catch (Exception ex)
         {
             LogHelper.CommLogger.Error($"图片加密出现异常:{ex}");
             callback?.Invoke(progress, ex.Message);
         }
     }
     lock (locker)
     {
         groupCount--;
         progress = Math.Min(progress + each, 100);
     }
     callback?.Invoke(progress, $"正在加密progress:{progress},groupCount:{groupCount}");
 }
Beispiel #5
0
        public void Start(Action <int, string> callback, string path, EnumCMD cmd, string connStr)
        {
            bool   ok      = false;
            string message = "升级成功";

            try
            {
                ok = ExecuteEncryptFile(callback, path, cmd, connStr);
                if (ok)
                {
                    callback?.Invoke(100, "加/解密完成");
                }
            }
            catch (Exception ex)
            {
                ok      = false;
                message = ex.Message;
                Console.WriteLine(ex.Message);
                callback?.Invoke(100, ex.Message);
                throw ex;
            }
        }
Beispiel #6
0
        public void Start(Action <int, string> callback, string path, EnumCMD cmd, string connStr)
        {
            bool   ok      = false;
            string message = "升级成功";

            try
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                ok = ExecuteEncryptFile(callback, path, cmd, connStr);
                sw.Stop();
                LogHelper.CommLogger.Info($"加密总耗时:{sw.ElapsedMilliseconds}");
                Thread.Sleep(500);
            }
            catch (Exception ex)
            {
                ok      = false;
                message = ex.Message;
                Console.WriteLine(ex.Message);
                callback?.Invoke(100, ex.Message);
                throw ex;
            }
        }
Beispiel #7
0
        /// <summary>
        /// 加密数据库
        /// </summary>
        /// <param name="callback"></param>
        /// <param name="dbs">操作数据库</param>
        /// <param name="connStrs">连接字符串</param>
        /// <param name="sqlFindColumns">查找语句</param>
        /// <param name="cmd">命令</param>
        /// <returns></returns>
        bool ExecuteEncryptDatabase(Action <int, string> callback, string[] dbs, Dictionary <string, string> connStrs, EnumCMD cmd)
        {
            int progress = 10;

            callback?.Invoke(progress, "开始查询待加密表和字段");
            LogHelper.CommLogger.Info("progress:{0},开始查询待加密表和字段", progress.ToString());
            foreach (var db in dbs)
            {
                callback?.Invoke(progress, $"开始加密数据库{db}");
                LogHelper.CommLogger.Info($"开始加密数据库{db}");
                var sqlFindTable = GetSqlFindTables(db);
                LogHelper.CommLogger.Info("获取待加密表和字段:{0}", sqlFindTable);
                List <TableInfo> tables = new List <TableInfo>();
                using (DataTable dt = MySqlHelper.ExecuteDataset(connStrs[db], sqlFindTable).Tables[0])
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        TableInfo info = new TableInfo {
                            table = dr["TABLE_NAME"].ToString(), column = dr["COLUMN_NAME"].ToString()
                        };
                        tables.Add(info);
                        LogHelper.CommLogger.Info($"查询到待加密表:{info.table},字段:{info.column}");
                    }
                }
                //把需要加密的字段按表名称分组,生成SQL可以一次性修改同一个表内的多个字段
                Dictionary <string, List <TableInfo> > pairs = new Dictionary <string, List <TableInfo> >();
                foreach (var item in tables)
                {
                    if (!pairs.ContainsKey(item.table))
                    {
                        var list = new List <TableInfo>();
                        list.Add(item);
                        pairs.Add(item.table, list);
                    }
                    else
                    {
                        pairs[item.table].Add(item);
                    }
                }
                callback?.Invoke(progress, "查询待加密表和字段完成");
                var path = GetScriptPath(db);
                if ((cmd == EnumCMD.EncryptToSQL || cmd == EnumCMD.DecryptToSQL) && File.Exists(path))
                {
                    File.Delete(path);
                }
                int total = pairs.Count;
                int each  = 90 / dbs.Length / total;
                foreach (var item in pairs)
                {
                    try
                    {
                        LogHelper.CommLogger.Info($"正在加密表{item.Key}");
                        callback?.Invoke(Math.Min(progress += each, 100), $"正在加密表{item.Key}");
                        Encrypt(item, connStrs[db], cmd, path);
                        LogHelper.CommLogger.Info($"加密表{item.Key}完成");
                    }
                    catch (Exception ex)
                    {
                        LogHelper.CommLogger.Error($"对数据库{db}加密出现异常:{ex.Message}");
                        callback?.Invoke(progress, ex.Message);
                    }
                    Thread.Sleep(200);
                }
                LogHelper.CommLogger.Info($"加密数据库{db}完成");
            }
            LogHelper.CommLogger.Info("所有数据库加密完成");
            return(true);
        }
Beispiel #8
0
        /// <summary>
        /// 获取加密sql
        /// </summary>
        /// <param name="table"></param>
        /// <param name="cloumns"></param>
        /// <param name="dr"></param>
        /// <returns></returns>
        private string GetSqlEncryptColumn(string table, string[] cloumns, DataRow dr, EnumCMD cmd)
        {
            var sql = $"update {table} set";

            try
            {
                int cloumnsIsNull = 0;
                for (int i = 0; i < cloumns.Length; i++)
                {
                    if (dr[cloumns[i]] == null)
                    {
                        cloumnsIsNull++;
                        continue;
                    }
                    sql += (i == 0) ? $" {cloumns[i]} = '" : $" , {cloumns[i]} = '";
                    if (cmd == EnumCMD.EncryptToSQL || cmd == EnumCMD.EncryptToDatabase)
                    {
                        sql += $"{ UdfEncrypt.SM4Encrypt(dr[cloumns[i]].ToString())}' ";
                    }
                    else if (cmd == EnumCMD.DecryptToSQL || cmd == EnumCMD.DecryptToDataBase)
                    {
                        sql += $"{ UdfEncrypt.SM4Decrypt(dr[cloumns[i]].ToString())}' ";
                    }
                }
                sql += $"where id = '{dr["ID"].ToString()}';";
                if (cloumnsIsNull == cloumns.Length)
                {
                    sql = string.Empty;                                  //校验待加密字段是否全部位null
                }
            }
            catch (Exception ex)
            {
                throw;
            }
            return(sql);
        }
Beispiel #9
0
        public void Start(Action <int, string> callback, string[] dbs, Dictionary <string, string> connStrs, EnumCMD cmd)
        {
            bool   ok      = false;
            string message = "升级成功";

            try
            {
                ok = ExecuteEncryptDatabase(callback, dbs, connStrs, cmd);
                if (ok)
                {
                    callback?.Invoke(100, "加/解密完成");
                }
            }
            catch (Exception ex)
            {
                ok      = false;
                message = ex.Message;
                Console.WriteLine(ex.Message);
                callback?.Invoke(100, ex.Message);
                throw ex;
            }
        }
Beispiel #10
0
 /// <summary>
 /// 加密文件
 /// </summary>
 /// <param name="callback"></param>
 /// <param name="path"></param>
 /// <param name="cmd"></param>
 /// <param name="connStr"></param>
 /// <returns></returns>
 bool ExecuteEncryptFile(Action <int, string> callback, string path, EnumCMD cmd, string connStr)
 {
     //加/解密单个文件
     if (cmd == EnumCMD.EncryptFile || cmd == EnumCMD.DecryptFile)
     {
         progress = 10;
         callback?.Invoke(progress, "开始查询待处理文件)");
         LogHelper.CommLogger.Info("开始查询待处理文件");
         string[] paths = new string[] { path };
         try
         {
             ImgEncrypt(paths, cmd);
         }
         catch (Exception ex)
         {
             LogHelper.CommLogger.Error($"加/解密单个文件出现异常:{ex.Message}");
             callback?.Invoke(100, ex.Message);
             return(false);
         }
     }
     //加/解密文件夹
     else if (cmd == EnumCMD.EncryptFolder || cmd == EnumCMD.DecryptFolder)
     {
         progress = 10;
         callback?.Invoke(progress, "开始查询待处理文件)");
         LogHelper.CommLogger.Info("开始查询待处理文件");
         var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".png") || s.EndsWith(".jpg") || s.EndsWith(".jepg")).ToArray();
         //var files = Directory.GetFiles(path, "*.jpg", SearchOption.AllDirectories);
         LogHelper.CommLogger.Info($"查询到待处理文件数量:{files.Length}");
         if (files.Length % 100 > 0)
         {
             groupCount = (files.Length / 100) + 1;
         }
         else
         {
             groupCount = files.Length / 100;
         }
         int each = 90 / groupCount == 0 ? 1 : 90 / groupCount;
         for (int i = 0; i < files.Length; i += 100)
         {
             string[] paths = files.Skip(i).Take(100).ToArray();
             Task.Run(() => ImgEncrypt(paths, cmd == EnumCMD.EncryptFolder ? EnumCMD.EncryptFile : EnumCMD.DecryptFile, each, callback));
             Thread.Sleep(200);
         }
     }
     //一键加/解密人脸
     else if (cmd == EnumCMD.EncryptFileOneKey || cmd == EnumCMD.DecryptFileOneKey)
     {
         progress = 10;
         callback?.Invoke(progress, "开始查询待处理文件)");
         LogHelper.CommLogger.Info("开始查询待处理文件");
         List <string> pathsStr = new List <string>();
         using (DataTable dt = MySqlHelper.ExecuteDataset(connStr, GetSqlFindHead()).Tables[0])
         {
             foreach (DataRow dr in dt.Rows)
             {
                 if (dr["PhotoPath"] != null)
                 {
                     var ps = dr["PhotoPath"].ToString().Split('/');
                     if (ps.Length == 7)
                     {
                         var p = Path.Combine(path, ps[3], ps[4], ps[5], ps[6]);
                         pathsStr.Add(p);
                     }
                 }
                 if (dr["DataPath"] != null)
                 {
                     var ps = dr["DataPath"].ToString().Split('/');
                     if (ps.Length == 8)
                     {
                         var s1 = ps[4].Substring(0, 6);
                         var s2 = ps[4].Substring(6, 2);
                         var p  = Path.Combine(path, ps[3], s1, s2, ps[5], ps[6], ps[7]);
                         pathsStr.Add(p);
                     }
                 }
             }
         }
         LogHelper.CommLogger.Info($"查询到待处理文件数量:{pathsStr.Count}");
         string[] pathsArr = pathsStr.ToArray();
         if (pathsArr.Length % 100 > 0)
         {
             groupCount = (pathsArr.Length / 100) + 1;
         }
         else
         {
             groupCount = pathsArr.Length / 100;
         }
         int each = 90 / groupCount == 0 ? 1 : 90 / groupCount;
         for (int i = 0; i < pathsArr.Length; i += 100)
         {
             string[] paths = pathsArr.Skip(i).Take(100).ToArray();
             Task.Run(() => ImgEncrypt(paths, cmd == EnumCMD.EncryptFileOneKey ? EnumCMD.EncryptFile : EnumCMD.DecryptFile, each, callback));
             Thread.Sleep(200);
         }
     }
     while (groupCount > 0)
     {
         Thread.Sleep(200);
     }
     LogHelper.CommLogger.Info("所有图片加密完成");
     return(true);
 }
Beispiel #11
0
 public async Task StartAsync(Action <int, string> callback, string[] dbs, Dictionary <string, string> connStrs, EnumCMD cmd)
 {
     await Task.Factory.StartNew(() =>
     {
         Start(callback, dbs, connStrs, cmd);
     });
 }
Beispiel #12
0
        /// <summary>
        /// 对单个表进行加密
        /// </summary>
        /// <param name="pair"></param>
        /// <param name="connStr"></param>
        private void Encrypt(KeyValuePair <string, List <TableInfo> > pair, string connStr, EnumCMD cmd, string path)
        {
            List <string> list = new List <string>();

            foreach (var item in pair.Value)
            {
                list.Add(item.column);
            }
            var offset = 0;

            string[] columns = list.ToArray(); //待加密字段
            while (true)
            {
                try
                {
                    string    sqlFindColumn    = GetSqlFindColumn(pair.Key, columns, offset);
                    string    sqlEmcryptColumn = string.Empty;
                    DataTable dt = MySqlHelper.ExecuteDataset(connStr, sqlFindColumn).Tables[0];
                    if (dt != null && dt.Rows != null && dt.Rows.Count > 0)
                    {
                        LogHelper.CommLogger.Info($"查询到表{pair.Key}待加密数据条数:{dt.Rows.Count}");
                        foreach (DataRow row in dt.Rows)
                        {
                            if (row != null)
                            {
                                string encryptSql = GetSqlEncryptColumn(pair.Key, columns, row, cmd);
                                LogHelper.CommLogger.Info(encryptSql);
                                if (cmd == EnumCMD.EncryptToDatabase || cmd == EnumCMD.DecryptToDataBase) //直接执行加密到数据库
                                {
                                    sqlEmcryptColumn += encryptSql;
                                }
                                WriteSql(encryptSql, cmd, path);
                            }
                        }
                    }
                    else
                    {
                        LogHelper.CommLogger.Info($"查询到表{pair.Key}待加密数据条数:0");
                        break;
                    }
                    if (cmd == EnumCMD.EncryptToDatabase || cmd == EnumCMD.DecryptToDataBase)
                    {
                        LogHelper.CommLogger.Info("开始执行到数据库……");
                        int result = MySqlHelper.ExecuteNonQuery(connStr, sqlEmcryptColumn);
                        LogHelper.CommLogger.Info($"执行到数据库成功:{result}");
                    }
                    offset += 100;
                }
                catch (Exception ex)
                {
                    LogHelper.CommLogger.Error($"对表{pair.Key}加密出现异常:{ex}");
                    throw ex;
                }
            }
        }
Beispiel #13
0
        public void Start(Action <int, string> callback, string[] dbs, Dictionary <string, string> connStrs, Dictionary <string, string> sqlFindColumns, EnumCMD cmd)
        {
            bool   ok      = false;
            string message = "升级成功";

            try
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                ok = ExecuteEncryptDatabase(callback, dbs, connStrs, sqlFindColumns, cmd);
                sw.Stop();
                LogHelper.CommLogger.Info($"加密总耗时:{sw.ElapsedMilliseconds}");
                Thread.Sleep(500);
            }
            catch (Exception ex)
            {
                ok      = false;
                message = ex.Message;
                Console.WriteLine(ex.Message);
                callback?.Invoke(100, ex.Message);
                throw ex;
            }
        }
Beispiel #14
0
        /// <summary>
        /// 对单个表进行加密
        /// </summary>
        /// <param name="pair"></param>
        /// <param name="connStr"></param>
        private void Encrypt(KeyValuePair <string, List <TableInfo> > pair, string connStr, EnumCMD cmd, string path)
        {
            List <string> list = new List <string>();

            foreach (var item in pair.Value)
            {
                list.Add(item.column);
            }
            var offset = 0;
            var num    = 2000;

            string[]  columns = list.ToArray(); //待加密字段
            Stopwatch sw      = new Stopwatch();

            while (true)
            {
                string sqlEmcryptColumn = string.Empty;
                try
                {
                    sw.Restart();
                    string    sqlFindColumn = GetSqlFindColumn(pair.Key, columns, offset, num);
                    DataTable dt            = MySqlHelper.ExecuteDataset(connStr, sqlFindColumn).Tables[0];
                    if (dt != null && dt.Rows != null && dt.Rows.Count > 0)
                    {
                        LogHelper.CommLogger.Info($"查询到表{pair.Key}待加密数据条数:{dt.Rows.Count}");
                        foreach (DataRow row in dt.Rows)
                        {
                            if (row != null)
                            {
                                string encryptSql = GetSqlEncryptColumn(pair.Key, columns, row, cmd);
                                if (string.IsNullOrEmpty(encryptSql))
                                {
                                    //LogHelper.CommLogger.Info($"加密字段为空,无需加密……");
                                    continue;
                                }
                                LogHelper.CommLogger.Info(encryptSql);
                                if (cmd == EnumCMD.EncryptToDatabase || cmd == EnumCMD.DecryptToDataBase)
                                {
                                    sqlEmcryptColumn += encryptSql;
                                }
                                else
                                {
                                    sqlEmcryptColumn += encryptSql + Environment.NewLine;
                                }
                            }
                        }
                    }
                    else
                    {
                        LogHelper.CommLogger.Info($"查询到表{pair.Key}待加密数据条数:0");
                        break;
                    }
                    LogHelper.CommLogger.Info($"表{pair.Key}加密数据条数:{dt.Rows.Count},耗时:{sw.ElapsedMilliseconds}");
                    ExecuteSql(sqlEmcryptColumn, cmd, connStr, path);
                    offset += num;
                }
                catch (Exception ex)
                {
                    LogHelper.CommLogger.Error($"对表{pair.Key}加密出现异常,重新执行:{ex}");
                    if (!string.IsNullOrWhiteSpace(sqlEmcryptColumn))
                    {
                        ExecuteSql(sqlEmcryptColumn, cmd, connStr, path);  //重新执行一次,处理测试出现执行sql超时情况
                    }
                }
            }
            sw.Stop();
        }