【进阶修炼】——改善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 ...
随机推荐
- Android Studio入门指南 (历上最全,全球首发)
下载地址:http://pan.baidu.com/s/1CEMma 8月份的时候因为Android开发团队全部使用Android Studio进行开发,所以我整理了Android Studio的一些 ...
- Android之四大组件、六大布局、五大存储 总结
Android之四大组件.六大布局.五大存储 一.四大组件:Android四大组件分别为activity.service.content provider.broadcast receiver. ...
- 【Unity】2.10 利用VS2015编辑Unity的C#脚本
分类:Unity.C#.VS2015 创建日期:2016-03-31 一.简介 用VS2015编辑C#脚本时,如果让其"显示所有文件",就会看到VS2015解决方案资源管理器中项目 ...
- mongodb更新数组中的所有匹配项
假如集合中有如下数据 { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : & ...
- android studio - Manifest merger failed with multiple errors, see logs
今天编译运行的时候遇到了“Error:Execution failed for task ':test:processDebugManifest'.> Manifest merger faile ...
- 隐藏和显示服务器端控件以及Html控件
隐藏和显示服务器端控件以及Html控件 /// <summary> /// 隐藏控件 /// </summary> /// <param name="contr ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- 每日英语:Nelson Mandela Dies at 95
Nelson Mandela, who rose from militant antiapartheid activist to become the unifying president of a ...
- DIOCP开源项目-定义自己要发送的数据结构(MyObject)
印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图. 下面是客户 ...
- 透過手機 App 在 OpenELEC(XBMC)中輸入中文
這裡介紹如何使用手機 App 在沒有中文輸入法的 OpenELEC(XBMC)中輸入中文字. OpenELEC(XBMC)雖然有內建中文語系,但是卻沒有中文的輸入法,沒辦法直接輸入中文字,這對於一般家 ...