【进阶修炼】——改善C#程序质量(7)

时间:2023-01-16 18:12:25

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;可以得到很好的安全控制的灵活性。