【进阶修炼】——改善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调用系统软键盘
/** * * @MethodName:closeInputMethod * @Description:关闭系统软键盘 * @throws */ public void closeInputMetho ...
- [转] JDBC中的Statement和PreparedStatement的区别
以Oracle为例吧 Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume ...
- 携程的配置中心(阿波罗apollo)
https://github.com/ctripcorp/apollo https://pan.baidu.com/s/1dFEGMIX#list/path=%2Fmeetup%20ppt%2F040 ...
- iOS安全攻防(十八):数据保护API
数据保护API 题外话 开篇先扯几句题外话,许多朋友都问我怎么不写防啊,我确实有点犹豫.hackers总是想象如果自己是开发者会怎么写,然后才能找到入手点.同理,开发者们也要想象自己是hackers会 ...
- View:Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()的理解
Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反.提供了 getLeft(), getTop(), getBottom(), getRight() 这些API来获取 ...
- Fluent UDF【6】:预处理命令
今天要讲的内容是关于C语言的预处理.搞清楚了这个,就可以分析UDF中的各种头文件源代码,从此写UDF不求人. 1 关于预处理 在UDF的各种头文件中(文件路径D:\Program Files\ANSY ...
- at org.apache.catalina.webresources.CachedResource.validateResources
"catalina-exec-659" #5239 daemon prio=5 os_prio=0 tid=0x00007fcba8099800 nid=0x581 waiting ...
- checkpoint and savepoint in FlinK
https://info.lightbend.com/rs/558-NCX-702/images/preview-apache-flink.pdf https://www.microsoft.com/ ...
- 递归分治算法之二维数组二分查找(Java版本)
[java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...
- xml属性定义
1. reference:参考某一资源ID. 1)属性定义: <declare-styleable name="名称"> <attr format="r ...