VB.NET 的winform程序数据库安全问题

VB.NET 的winform程序数据库安全问题,第1张

VBNET的程序很容易反编译的,所以写到类中好像并不安全

建议

1用户登录所使用的账户的权限一定要控制好

2可以把连接字符串硬编码到exe或者dll中,然后用NET的混淆软件加密混淆(一定要选择加密字符串)

3使用其他的技术使用户间接操作数据库。可以在服务器远程建立一个服务器(接受Sockets连接),或者建立一个动态网页。让用户连接到这些客户端,发送一些指令,对数据库的查操作由这个服务器上的程序代它完成,然后把结果给用户

android代码的混淆和加密:

通常来说Proguard对一般用途来说足够了,但是也需要注意一些程序风格,增强proguard的效果。

1、 特定类的public函数不做实际的事情,只做简单处理后调用private函数。proguard对会对一些特定类的public函数不做混淆,以便被AndroidManifestxml和各种layout引用。

2、会被AndroidMinifestxml和layout引用的类放在浅层的包中,需要隐藏的类放在较深处,以便proguard混淆包名带来好处。如果一个包中有需要不混淆的内容,则整个包名都不会被混淆。

3、将函数根据功能分细切短也会有些益处。当然如果隐藏代码的要求比较高,还是用native好了。

望采纳!!

android中用的到加密:

Https编程  :应该是使用带安全的网络协议处理。除非你本地需要加密

2数据签名:混淆代码和防二次打包的APK加密技术

3对称加密:可以先将数据通过某种加密方式加密发送到服务器端,然后服务器端再解密 ,项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密

4非对称加密====支付宝

数字摘要是指通过算法将长数据变为短数据,通常用来标识数据的唯一性,是否被修改,常用的加密算法有md5和sha1两种,如Android的App签名也是用的这两种算法。

由于以上两种生成数字摘要的算法都是不可逆的,对于可逆的加密算法中,按照密钥的数量和加密规则一半分为对称加密和非对称加密两类:

对称加密:

密钥可以自己指定,只有一把密钥,如果密钥泄漏数据就会暴漏;

常用的对称加密算法有DES和AES两种;

特点是加密速度快,但是缺点是安全性低,因为只要密钥暴漏,数据就可以被解密。

非对称加密的特点:

常见的非对称加密算法是RSA;

他有两把密钥,且是由程序生成的,不能自己指定;

特点是加密速度比较慢,但是安全性比较高;

加密和解密的规则是:公钥加密只能私钥解密,私钥加密只能公钥解密;

加密锁:威步(WIBU)的CodeMeter,AxProtector(fornet)两款软件加密锁性能非常不错混淆的问题,与传统的代码混淆工具(Obfuscator)不同,AxProtector可以完全阻止对NET 程序集(由 C#, VBNET, DelphiNET, ASPNet… 等语言编写)的反编译。通俗的讲,AxProtector在破解者和您的 NET 代码之间构建了强大的防破解保护屏障,生成一个基于 Windows 的而不是基于 MSIL 的兼容格式文件。原始的 NET 代码完整的被加密后封装在本地代码内,无论何时都不会释放到硬盘,对于破解者是不可见的。与单纯的net加密软件不同,AxProtector与CodeMeter硬件加密狗配套餐使用,采用了更为严密的密钥管理,及最先进的AES、RSA、ECC等加密算法存储或传输密钥,保证通讯安全。Net代码编译后生成的 class 中包含有源代码中的所有信息(不包括注释),尤其是在其中保存有调试信息的时候。所以一个按照正常方式编译的class 文件可以非常轻易地被反编译。一般软件开发商会采用一种叫做混淆器的工具。混淆器的作用是对编译好的代码进行混淆,使得其无法被反编译或者反编译后的代码混乱难懂。由于混淆器只是混淆了方法名称或流程,而不能防止源代码被反编译,因此混淆器的作用只是增加了反编译的难度,最终的结果也是治标不治本。对于一些掌握工具的人来说几乎还是透明的。AxProtector是一款真正意义的加密源代码、防止反编译的net软件加密软件。AxProtector加密了net原代码,任何时候原代码都不可能被还原到硬盘当中。采用AxProtector加密后的net代码只有在程序调用或执行某一段函数的时候,才能通过AxProtectorClass在内存中解密后返回到程序中执行,运行之后迅速立即加密。这种随机加密、按需解密原代码的功能,能很好的防止Net程序的反编译,同时能够很好地防止API加密点被摘除。有效地保证了源代码的执行效率和安全性。

混淆加密有各种不同的算法, 必须知道他的算法才可以解密;Xenocode Fox,一款类似 Reflector 的 net 反编译工具等借助反编译工具可以破解,至于你加密后不能正常使用,建议你好好看看你加密工具的使用文档,一般都有详细的说明

c# dll 加密最快的方法使用加壳工具Virbox Protector,直接加密,Virbox Protectorke可以对dll进行性能分析,分析每个函数的调用次数,对每个函数选择保护方式如:混淆/虚拟化/碎片化/代码加密等;每种加密方法的特点是什么呢?

代码加密(X86):

针对X86汇编代码:一种代码自修改技术(SMC)保护代码。把当前代码加密存储为密文,存储起来,当程序运行到被保护函数时候自动解密并且执行,执行之后再擦除代码,运行到哪里才解密哪里的代码,黑客无法获得原始机器指令和内存完整性的代码,由于是纯内存操作所以运行速度快, 性价高的保护手段,建议全加

代码加密(IL)

针对dotNet程序,保护IL代码:一种动态运行方法解密被保护代码。把当前代码加密存储为密文,存储起来,当程序运行到被保护函数时候自动解密并且执行,执行之后再擦除代码,执行之后再擦除代码,运行到哪里才解密哪里的代码,黑客无法获得原始的中间语言的指令和内存完整性的代码,由于是纯内存操作所以运行速度快, 性价高的保护手段,建议全加

压缩

类似zip等压缩软件把代码和数据段压缩,由于带有动态密码,没有任何工具可以自动脱壳,是防止反编译和反汇编关键手段。

代码混淆(IL):

将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。

a)重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。

b) 打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。

c) 添加花指令,通过特殊构造的指令来使得反汇编器出错,进而干扰反编译工作的进行。

代码混淆器也会带来一些问题。主要的问题包括:· 被混淆的代码难于理解,因此调试除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。· 对于支持反射的语言,代码混淆有可能与反射发生冲突。· 代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。

代码混淆的特点是安全度低、不会影响效率。

代码虚拟化:

针对X86代码: 是指将机器代码翻译为机器和人都无法识别的一串伪代码字节流;在具体执行时再对这些伪代码进行一一翻译解释,逐步还原为原始代码并执行。 这段用于翻译伪代码并负责具体执行的子程序就叫作虚拟机VM(好似一个抽象的CPU)。它以一个函数的形式存在,函数的参数就是字节码的内存地址。 由于虚拟机代码和虚拟机CPU的实现可以做到每次都是随机设计和随机执行 并且代码每次可以随机变化,包括一些逻辑上的等价变化可以参考硬件N个与非门NOT-AND实现各种逻辑门,算法和访问内存形式的变化,包括数学上的非等价变化,代码体积几乎可以膨胀达到100到10000倍,造成机器无法做算法还原到原有逻辑。

代码虚拟化的特点是:安全度中、不会影响效率。

代码碎片化:

深思自主知识产权的最新技术:基于 LLVM 和 ARM 虚拟机技术,自动抽取海量代码移入 SS 内核态模块,极大的降低了使用门槛, 不再需要手动移植算法,可移植的算法从有限的几个增长到几乎无限多,支持的语言也不再限于 C, 这是加密技术的一次综合应用,效果上类似于将软件打散执行,让破解者无从下手。

安全度高、建议关键函数或调用加密锁方法;使用太多会影响效率

我们采用C#来实现,C#下有一个完整的WEB DEBUGGER(含代理服务器方式实现的HTTP请求拦截与篡改功能)--Fiddler,Fiddler是一个免费软件,所以并没有对源码进行混淆和加密,反编译后的代码可读性也很好。我们后面的所有代码,主要就是参考他的代码来实现,当然他实现的功能非常强大,我们仅仅是演示一下HTTP请求与拦截技术的实现,所以没有必要完整的去模拟它,故而我们模拟的原则是,手动的一个类一个类一个方法一个方法的进行模拟,在模拟的过程中能简化的尽量简化,有些思路不太清楚,或者的确是重复造轮子的部分,就直接使用他的代码,以后如果有时间,再对其源码进行一次详细的分析与研究,这次有些部分我们就不再深究了。

首先,我们来实现一个代理服务器,完成HTTP请求的拦截,先来看一看实现后的样子,这样有助于理解代码。编译后的程序,我拷贝了一份放在了附录的根目录下的Build文件夹里,在build文件夹里找到这个(图1),双击启动需要net framework 40 没有的到微软官网下载。 启动后如图所示:(图2)

这时候,我们打开浏览器,随便CHROME,FIREFOX还是IE,然后输入 trainingzhunxinnet 回车(Enter) 。 看一下我们的主界面,没有任何反应,这是正常的,因为我们还没有设置代理服务器。 :) 任何浏览器,都有设置代理服务器的地方,鉴于天朝 IE的使用率,这里讲IE里的操作步骤。 打开IE--工具--Internet选项--连接--局域网设置。(图1) 勾上(跳过本地地址的代理服务器不要勾选),然后点高级。(图2) HTTPS和FTP等不要设置(本代理服务器未对这两种协议进行处理),IP是127001表示代理服务器是在本机,监听端口设成8888,目前代码里写死了。

在IE里设置完后,我们会发现其它浏览器也自动开始使用代理服务器了,这是因为设置代理服务器是系统的功能,每个浏览器打开的都是同一个设置代理服务器的程序 看到这里,大家是不是发现了什么问题。我们不是以后每次要拦截的时候,都要手动设置一次代理服务器吧,-_-!!! ,当然,这是不可能的,后面我们将在篡改一节的开始,就实现一个自动设置代理服务器的功能,这样,当我们的代理服务器启动的时候,就自动将本机的代理服务器设置成自己,退出的时候,再恢复成原样,这样就不再需要向上面一样手动设置了。 OKAY, 一切就绪了,这时候,再次在浏览器里输入网址:trainingzhunxinnet。 看下主界面:(图1) 看左边,会话已经被监听到了。我们点第一栏的编号为1的会话,界面如下:(图2) 看右边,先看上面的文本框,这里显示出了HTTP请求的头信息,再看下面的文本框,这里也显示出了HTTP响应的头信息。 从这两张图里我们可以清楚看到,所有的请求和响应信息都已经被我们监听到了。 再看一下浏览器,网页也正常的打开了,速度也不是很慢,看来,我们的代理服务器算是正常的运转起来了。

  $file = 'pluginphp'; //要破解的文件

  $fp = fopen($file, 'r');

  $str = fread($fp, filesize($file));

  fclose($fp);

  copy($file, '0_'$file);

  $n = 1;

  while($n < 10){

  $code = strdecode($str);

  if($n == 1){

  $code = str_replace("__FILE__", "'0_$file'", $code);

  }

  $replace = '$decode'$n'=trim';

  if(strpos($code, 'eval(') > 0){

  $code = str_replace('eval(', $replace'(', $code);

  }else{

  preg_match("/@\\$()\(\\$(),()\(/isU", $code, $res);

  $code = str_replace($res[3], "'$replace", $code);

  }

  $code = preg_replace('/\\$()=false;()\(\);/', '', $code); //上一版本

  $code = preg_replace('/\|\|@\\$()\(\);/', '|| print("ok");', $code);

  $code = destr($code);

  $tmp_file = 'detmp'$n'php';

  file_put_contents($tmp_file, $code);

  include($tmp_file);

  $val = 'decode'$n;

  $str = $$val;

  unlink($tmp_file);

  if(strpos($str, ';>') === 0){

  $decode = $str;

  break;

  }

  $str = " $n++;

  }

  $decode = preg_replace("/^()exit\('Access Denied'\); /", " $del = strrchr($decode, 'unset');

  $decode = str_replace($del, "\r\n>", $decode);

  file_put_contents($file'dephp' ,$decode);

  unlink('0_'$file);

  echo 'done';

  ////////////

  function val_replace($code, $val, $deval){

  $code = str_replace('$'$val',', '$'$deval',', $code);

  $code = str_replace('$'$val';', '$'$deval';', $code);

  $code = str_replace('$'$val'=', '$'$deval'=', $code);

  $code = str_replace('$'$val'(', '$'$deval'(', $code);

  $code = str_replace('$'$val')', '$'$deval')', $code);

  $code = str_replace('$'$val'', '$'$deval'', $code);

  $code = str_replace('$'$val'/', '$'$deval'/', $code);

  $code = str_replace('$'$val'>', '$'$deval'>', $code);

  $code = str_replace('$'$val'<', '$'$deval'<', $code);

  $code = str_replace('$'$val'^', '$'$deval'^', $code);

  $code = str_replace('$'$val'||', '$'$deval'||', $code);

  $code = str_replace('($'$val' ', '($'$deval' ', $code);

  return $code;

  }

  function fmt_code($code){

  global $vals,$funs;

  preg_match_all("/\\$[0-9a-zA-Z\[\]']+(,|;)/iesU", $code, $res);

  foreach($res[0] as $v){

  $val = str_replace(array('$',',',';'), '', $v);

  $deval = destr($val, 1);

  $vals[$val] = $deval;

  $code = val_replace($code, $val, $deval);

  }

  preg_match_all("/\\$[0-9a-zA-Z\[\]']+=/iesU", $code, $res);

  foreach($res[0] as $v){

  $val = str_replace(array('$','='), '', $v);

  $deval = destr($val, 1);

  $vals[$val] = $deval;

  $code = val_replace($code, $val, $deval);

  }

  preg_match_all("/function\s[0-9a-zA-Z\[\]]+\(/iesU", $code, $res);

  foreach($res[0] as $v){

  $val = str_replace(array('function ','('), '', $v);

  $deval = destr($val, 1);

  $funs[$val] = $deval;

  $code = str_replace('function '$val'(', 'function '$deval'(', $code);

  $code = str_replace('='$val'(', '='$deval'(', $code);

  $code = str_replace('return '$val'(', 'return '$deval'(', $code);

  }

  return $code;

  }

  function strdecode($str){

  $len = strlen($str);

  $newstr = '';

  for($i=0; $i<$len; $i++){

  $n = ord($str[$i]);

  $newstr = decode($n);

  }

  return $newstr;

  }

  function decode($dec){

  if(($dec > 126 || $dec<32) && $dec<>13 && $dec<>10){

  return '['$dec']';

  }else{

  return chr($dec);

  }

  }

  function destr($str, $val=0){

  $k = 0;

  $num = '';

  $n = strlen($str);

  $code = '';

  for($i=0; $i<$n; $i++){

  if($str[$i] == '[' && ($str[$i+1]==1 || $str[$i+1]==2)){

  $k = 1;

  }elseif($str[$i] == ']' && $k==1){

  $num = intval($num);

  if($val==1){

  $num = 97 + fmod($num, 25);

  }

  $code = chr($num);

  $k = 0;

  $num = null;

  }else{

  if($k == 1){

  $num = $str[$i];

  }else{

  $code = $str[$i];

  }

  }

  }

  return $code;

  }

  >

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » VB.NET 的winform程序数据库安全问题

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情