【进阶修炼】——改善C#程序质量(7)
113,声明变量时考虑最大值。
Ushort的最大值是65535,用于不同的用途这个变量可能发生溢出,所以设计时应充分了解每个变量的最大值。
114,MD5不再安全。
MD5多用于信息完整性的校验。R=H(S),MD5的算法是不可逆的,也就是我们几乎没有可能根据生产的MD5码去还原原文。但是我们可以使用穷举的办法生成MD5码来对比,由于我们平常设定的密码都比较简单,如:123456,根本不用很长的时间就会被破解掉。为了有效防止破解,一个可行的做法是为我们的密码固定加一个字符串“%¥#……@!&×()”,再进行MD5加密,增加反向穷举的难度,这里假定的是破解者拿到了DB里保存的MD5串,而不是通过用户界面输入密码来穷举。
115,通过Hash值来校验文件是否被篡改。
MD5算法产生的Hash值可以用来校验文件的完整性。虽然多个不同的样本可以得到相同的hash值,但是这种几率不大。
116,避免用非对称算法加密文件。
非对称算法强度较高,算法的执行数度较慢,不适合用来加密文件。可以考虑用对称算法来加密文件。
117,使用SSL确保通信中的数据安全。
关于SSL,即(Secure Socket Layer)的具体信息,可以查阅其他相关的文档。
118,使用SecureString保存计算机中的敏感数据。
String对象在内存中是可见的,并且它不能被显示销毁,只能靠垃圾回收器来销毁。对于一些恶意扫描内存的程序,我们的银行卡密码等信息就容易被泄露。而存入SecureString的字符是经过加密的,并且是存放在非托管内存中的。我们通过.AppendChar方法添加字符。通过IntPtr ptr = Marshal.SecureStringToBSTR(ss); string original = Marshal.PtrToStringBSTR(ptr);得到原始字符串。另外一定要对指针ptr 进行销毁Marshal.ZeroFreeBSTR(ptr)。
119,不要使用自己的加密算法。
算法是不能保密的,通过一些反编译程序或其他的一些手段都能够破解。著名的加密算法如DES等都是公开算法逻辑的,真正需要保密的是密钥。我们自己创建的加密算法没有经过验证,几乎不可能比DES等流行算法还要安全,毕竟我们不是密码学家。
120,为程序集使用强名称。
为程序集签名,可以确保程序集的唯一性,即使有一个和它同名的文件存在,也可以被正常区分,不会造成调用的失效。签名前的程序集WindowsFormsDynamic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null,签名后WindowsFormsDynamic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38a587009b65cbfe多了一个唯一的公钥key。我们在使用这个dll的时候必须指定完整的程序集信息,包括公钥key,如反射的时候,才能正常使用。查看本机中已经安装的数字证书,可以用X509Store类得到。
121, 为应用程序设定运行权限。
通过为方法或类添加[PrincipalPermission(SecurityAction.Demand, Role = @"Users")]特性,可以规定只有指定组的用户才能运行程序,否则抛出异常。当然我们还需要启用Windows认证AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);。我们还可以自定义用户和组:GenericIdentity identity = new GenericIdentity("examUser");GenericPrincipal principal = new GenericPrincipal(identity, new string[] {"Users"});Thread.CurrentPrincipal = principal;可以得到很好的安全控制的灵活性。
【进阶修炼】——改善C#程序质量(7)的更多相关文章
- 【进阶修炼】——改善C#程序质量(1)
这是一个大纲形式的概要,以便自己可以花较少的时间反复阅读.在开发中,多加注意这些有用的建议,让自己成为一个更优秀的程序员.内容主要来自<编写高质量代码-改善C#程序的157个建议>(陆敏技 ...
- 【进阶修炼】——改善C#程序质量(10)
158,不要写冗余注释. 注释应该写代码没有表达的东西. 代码能够自我描述就不要加注释. 159,废弃的注释应该尽早删除. 废弃的注释由于年代太久远,已经和现在的代码逻辑不匹配了,这样的注释只会误导人 ...
- 【进阶修炼】——改善C#程序质量(9)
140,使用默认的访问修饰符. 如果不加访问修饰符,成员变量的默认是private的,类默认是internal的.为了明确访问的权限,我倒是建议都加上访问修饰符,这省不了多少代码. 141,不知道该不 ...
- 【进阶修炼】——改善C#程序质量(8)
122,以<Company>.<Component>作为命名空间. 如Microsoft.Windows.Design.也可以用域名作为空间,如www.microsoft.co ...
- 【进阶修炼】——改善C#程序质量(6)
90,不应为抽象类指定public的构造函数. 抽象类即使指定了public的构造函数,也是不能实例化的,编译通不过.抽象类的构造函数应该设定为protected,它的作用应该是初始化自己的成员,以及 ...
- 【进阶修炼】——改善C#程序质量(5)
71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而 ...
- 【进阶修炼】——改善C#程序质量(4)
46, 显示释放资源,需要实现IDisposable接口. 最好按照微软建议的Dispose模式实现.实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理. 47, 即使提供了 ...
- 【进阶修炼】——改善C#程序质量(3)
32, 总是优先考虑泛型. 泛型代码有很好的重复利用性,和类型安全性. 33, 应尽量避免在泛型类中声明静态成员. 静态成员达不到共享的目的.List<int>和List<Strin ...
- 【进阶修炼】——改善C#程序质量(2)
16, 元素可变的情况下应避免用数组. 数组是定长的集合,可以考虑用ArrayList或List<T>集合.ArrayList元素是object类型,有装箱的开销,性能较低.另外Array ...
随机推荐
- Cross compiling coreutils and generate the manpages
When we cross compiling coreutils, there is an problem of generating man pages, because the source s ...
- Vue 动态组件、动画、插件
1 动态组件 ①简单来说: 就是几个组件放在一个挂载点下,然后根据父组件的某个变量来决定显示哪个,或者都不显示. ②动态切换: 在挂载点使用component标签,然后使用v-bind:is=”组件名 ...
- 使用C# 链接 Mysql 显示??? 乱码 的解决方案
下载以下文件 mysql-connector-odbc-5.3.6-win32.msi 下载并打开以下文件: mysql-installer-community-5.6.28.0.msi 安装mysq ...
- 《深入理解jvm》笔记---第六章
类文件结构 1. Java一次编写,到处执行的基石: Java编译产生的是字节码(bytecode).sun公司和其它虚拟机提供商公布各个平台上的虚拟机.这些虚拟机能够加载和执行这些与平台无关的 ...
- Ubuntu java install & config
im:http://jingyan.baidu.com/article/08b6a591cb06f114a8092209.html http://www.cnblogs.com/zknublx/p/5 ...
- Android开发:SharedPreferences 存储数据、获取数据
Android开发:SharedPreferences 存储数据.获取数据 email:chentravelling@163.com 开发环境:win7 64位,Android Studio. 关于S ...
- VS2015中运行ASPX老项目出错HTTP Error 500.23 - Internal Server Error错误
今天翻出以前用VS2010做的老项目,在VS2015中运行ASPX页面浏览,出现错误: HTTP Error 500.23 - Internal Server Error 检测到在集成的托管管道模式下 ...
- spark repartition
https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-rdd-partitions.html http://s ...
- Java数据库连接池实现原理
一般来说,Java应用程序访问数据库的过程是: 装载数据库驱动程序: 通过jdbc建立数据库连接: 访问数据库,执行sql语句: 断开数据库连接. public class DBConnection ...
- [Windows Azure] Load Testing in Windows Azure
The primary goal of a load test is to simulate many users accessing a web application at the same ti ...