《加密灵活性》word版.doc_第1页
《加密灵活性》word版.doc_第2页
《加密灵活性》word版.doc_第3页
《加密灵活性》word版.doc_第4页
《加密灵活性》word版.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

加密灵活性加密灵活性2010-05-14 20:38Bryan Sullivan目录规划将来利用潜在的问题可选的用法和语法加密灵活性的另一个好处总结纵观历史,人们用各种加密方式对其敌人隐藏信息。朱丽斯恺撒通过将字母移动三位的加密方式(将字母A转换为D,B转换为E,以此类推)来传递作战计划。在第二次世界大战中,德国的海军使用一种明显更高级的系统-Enigma计算机-来加密邮件并发送到其U型潜艇。目前,我们甚至更复杂的加密机制用作公钥基础结构,可帮助我们在Internet上执行安全的事务的一部分。但对于只要已做cryptographers机密代码,cryptanalysts有已尝试断开它们并窃取信息,和有时断路成功的代码。中断一次被认为是安全的加密算法,将变得不可用。在的算法中找到有时细微缺陷,而且有时它是只需访问更多的计算能力进行强力攻击的攻击者。最近,安全研究人员已作为结果的冲突;演示MD5哈希算法中的弱点也就是它们具有显示两个消息可以具有相同计算的MD5哈希值。它们已经创建了一个概念证明攻击此弱点,针对该公用密钥的基础结构保护电子商务网站上的事务。通过购买特制的Web站点证书从证书颁发机构(CA)用于MD5签署的证书,研究人员能够创建可以有效地使用模拟可能在Internet上的任何网站的恶意CA证书。它们结束MD5不适用于签名的数字证书应使用如该SHA 2算法的一个更强备选方法。(如果您感兴趣的学习有关此信息检索的更多信息,可以读取白皮书)。这些结果是肯定会导致的问题,但它们不是一个巨大的意外。年中,所示理论MD5弱点,MD5使用Microsoft产品中的已被禁止通过Microsoft SDL的加密标准2005年以来。有同样被禁止如SHA-1和RC2的其他常用一次的算法。图1显示加密算法禁止或经SDL的完整列表。SDL的批准算法的列表是当前在撰写本文但该列表检查,并且每年更新SDL更新过程的一部分。图1批准SDL的加密算法算法类型禁止(要替换现有代码中或只用于解密的算法)接受(除敏感数据的现有代码可接受的算法)建议(算法的新的代码)对称块DES,DESX,rc2 SKIPJACK 3DES(2或3个键)AES(=128位)对称流密封,CYLINK_MEK,RC4(128位)RC4(=128位)无,块密码是首选不对称RSA(2048位),Diffie-大(2048位)RSA(=2048bit),Diffie-大(=2048bit)RSA(=2048bit),Diffie-大(=2048bit),ECC(=256位)哈希(包括HMAC使用)SHA 0(SHA),SHA-1,md2,md4 md5 SHA-2 SHA-2(包括:sha-256 SHA-384、SHA-512)HMAC的密钥长度112位=112位=128位如果即使在您自己的代码中执行这些标准,使用最安全的算法和最长的密钥长度的不保证您今天编写的代码将保持安全。实际上,则将可能不保留任何指南历史记录是否安全。规划将来利用您可以通过您的旧应用程序立即解决此方案中不代码使,挑选出的易受攻击的算法实例化替换为新的算法,重新生成应用程序,通过回归的测试运行它们,然后颁发给您的用户的修补程序或服务包。这不是只用于您,大量但仍然留下您的用户的风险直到您可以提供修补程序。一个更好地替代方法是计划从一开始在此方案。与其在代码中硬编码特定的加密算法,不如使用Microsoft.NET Framework中内置的灵活加密功能。让我们看一看几个C#代码段,启动与最灵活的示例:复制代码private static byte computeHash(byte buffer)using(MD5CryptoServiceProvider md5=new MD5CryptoServiceProvider()return md5.ComputeHash(buffer);此代码是完全nonagile。与它相关一个特定的算法(MD5),以及该算法,MD5CryptoServiceProvider类的特定实现。修改此应用程序使用安全哈希算法需要更改代码,并发出一个修补程序。下面是一个小的更好示例:复制代码private static byte computeHash(byte buffer)string md5Impl=ConfigurationManager.AppSettingsmd5Impl;if(md5Impl=null)md5Impl=String.Empty;using(MD5 md5=MD5.Create(md5Impl)return md5.ComputeHash(buffer);此函数使用System.Configuration.Configuration管理器类检索自定义应用程序设置(在md5Impl从应用程序的配置文件设置)。在这种情况下,设置用于存储要使用的算法实现类的强名称。该代码将检索到此设置的值传递给静态函数MD5.Create创建所需的类的实例中。(System.Security.Cryptography.MD5是所有的实现,MD5算法必须派生的抽象基类。例如,应用程序md5Impl被设置为字符串System.Security.Cryptography.MD5Cng,System.Core,版本=,区域性=非特定于,PublicKeyToken=b77a5c 561934e089,MD5.Create会创建MD5Cng类的实例。这种方法解决只有一半我们加密的灵活性的问题实际上根本是没有解决方案。现在,我们可以指定MD5算法的实现而不必更改任何源代码如果缺陷发现类似于MD5Cng,等特定实现,但我们正在仍绑定到的MD5使用一般情况下可能会证明非常有用的。若要解决此问题,我们保留向上项目抽象化:复制代码private static byte computeHash(byte buffer)using(HashAlgorithm hash=HashAlgorithm.Create(MD5)return hash.ComputeHash(buffer);第一次看到此代码段不查找第一个示例差别很大。看起来我们已经再一次的硬编码MD5算法到通过HashAlgorithm.Create(MD5)调用应用程序。令人惊讶的是尽管此代码是显著比其他示例的两个密码更灵活。该方法的默认行为时调用HashAlgorithm.Create(MD5)-.NET 3.5的-是创建该MD5CryptoServiceProvider类的实例可以自定义运行库行为machine.config文件进行更改。让我们来更改此代码创建的而不是MD5 SHA512algorithm实例的行为。涓烘我们需要将两个元素添加到machine.config文件:cryptoClass要映射到我们希望;算法实现类的友好算法名称的元素和nameEntry旧的、已被否决算法的友好名称映射到新的友好名称的元素。复制代码configuration mscorlib cryptographySettings cryptoNameMapping cryptoClasses cryptoClass MyPreferredHash=SHA512CryptoServiceProvider,System.Core,Version=,Culture=neutral,PublicKeyToken=b77a5c 561934e089/cryptoClasses nameEntry name=MD5class=MyPreferredHash/cryptoNameMapping/cryptographySettings/mscorlib/configuration现在,我们的代码发出其调用HashAlgorithm.Create(MD5)时,在CLR中查找machine.config文件,并看到的字符串MD5应映射到友好算法名称MyPreferredHash。它然后看到该MyPreferredHash映射到类SHA512CryptoServiceProvider(如定义在程序集中System.Core,使用指定的版本、区域性和公钥标记),并创建该类的实例。值得注意的算法的重新映射会发生运行但不是在编译时:它是用户的machine.config,控制重新在映射,不在开发人员的。锲犳这种技术解决了我们的被绑定到一个特定的算法可能在将来某个时间中断的问题。避免使用硬编码在加密算法类到应用程序-而编码只加密算法,HashAlgorithm的抽象类型-我们创建的最终用户(更具体地说就的是具有管理权限的人编辑应用程序的位置安装在计算机上machine.config文件)可以确定精确的算法和实现应用程序将使用的应用程序。管理员可能选择替换最近已断开与仍被认为是安全的算法(渚嫔的方式替换MD5 SHA-256)或主动安全的算法替换为长的位长度(替换SHA-256 SHA到512之间的)的替代方法。潜在的问题修改machine.config文件以重新映射(如MD5默认算法类型字符串和SHA1)可能会解决加密的灵活性的问题,但它可以同时创建兼容性问题。对machine.config的更改会影响计算机上的每个.NET应用程序。在计算机上安装其他应用程序可能依赖MD5专门,并更改这些应用程序使用的算法可能破坏它们难以诊断的意外的方式。作为替代强制总更改到整个计算机的更好在代码中使用自定义、特定于应用程序的友好名称,并在machine.config中的首选类映射这些名称条目。例如,我们可以更改MD5将MyApplicationHash在我们的示例中:复制代码private static byte computeHash(byte buffer)using(HashAlgorithm hash=HashAlgorithm.Create(MyApplicationHash)return hash.ComputeHash(buffer);我们然后将项添加到映射MyApplicationHashmachine.config文件将MyPreferredHash类:复制代码cryptoClasses cryptoClass MyPreferredHash=SHA512CryptoServiceProvider,System.Core,Version=,Culture=neutral,PublicKeyToken=b77a5c 561934e089/cryptoClasses nameEntry name=MyApplicationHashclass=MyPreferredHash/此外可以将多个友好名称映射到相同的类;例如,您可能有一个友好的名称为您的应用程序的每个,而这种方式更改而不影响计算机上的每个其他应用程序特定的应用程序的行为:复制代码cryptoClasses cryptoClass MyPreferredHash=SHA512CryptoServiceProvider,System.Core,Version=,Culture=neutral,PublicKeyToken=b77a5c 561934e089/cryptoClasses nameEntry name=MyApplicationHashclass=MyPreferredHash/nameEntry name=MyApplication2Hashclass=MyPreferredHash/nameEntry name=MyApplication3Hashclass=MyPreferredHash/但是,我们仍不超出了与兼容性问题方面,乌兹我们自己的应用程序中。您需要有关的本地变量(暂时存储)和数据库和XML架构(永久存储)的存储大小,提前计划。渚嫔的方式MD5哈希值始终128长度为位。如果您的预算完全的128位代码或架构以存储哈希输出中,您不能升级到SHA-256(256位长度输出)或SHA到512之间(512位长度输出)。这不会beg问题的多少存储就足够了。足够,512位还是应使用1,024,2,048,或多个吗?我不能提供一个硬规则,因为每个应用程序具有不同的要求,但为一条经验法则建议您预算的两倍的空间散列您当前使用。为对称和非对称加密的数据,您可能最多保留空间的一个额外的10%。是不可能与输出大小明显大于现有算法的新算法将被广泛接受。但是,在持久状态(渚嫔的方式数据库或文件)中存储加密的数据或哈希值的应用程序具有更大的问题比保留足够的空间。如果您保持使用一个算法的数据,然后尝试在以后使用不同的算法的数据上操作,则不将得到预期的结果。渚嫔的方式它最好存储哈希密码而不是完整的纯文本版本。当用户试图登录时,代码可以将与在数据库中存储哈希为用户提供密码的哈希进行比较。如果哈希匹配,用户是可信的。但是,如果哈希值存储在一种格式(假设,MD5),并且应用程序升级到使用其他算法(例如,SHA-256),用户永远不会将能够登录,因为SHA-256密码的哈希值始终将不同于这些相同的密码的MD5哈希值。您可以通过解决此问题,在某些情况下为元数据与实际数据一起存储在原始的算法。然后,存储的数据时,使用灵活性的方法(或反射)实例化该算法最初而不是当前的算法:复制代码private static bool checkPassword(string password,byte storedHash,string storedHashAlgorithm)using(HashAlgorithm hash=HashAlgorithm.Create(storedHashAlgorithm)byte newHash=hash.ComputeHash(System.Text.Encoding.Default.GetBytes(password);if(newHash.Length!=storedHash.Length)return false;for(int i=0;i newHash.Length;i+)if(newHashi!=storedHashi)return false;return true;遗憾的是,如果您需要比较两个存储的哈希,它们必须使用相同的算法已创建。没有只比较SHA-256哈希以MD5哈希,并确定是否它们都创建来自同一原始数据方法。姝梾棰樼殑不好的灵活性加密的解决方案,并且我可以提供最好的建议是您应选择目前最安全的算法,然后制定升级计划,以防以后被中断的算法。一般情况下,加密灵活性往往会暂时比的数据持久性数据的好得多。可选的用法和语法假定您的应用程序设计允许加密灵活性使用,让我们继续看一些替代使用此方法的语法。我们已经重点几乎完全到相应的文章中的该点的加密哈希算法,但加密灵活性还适用于其他加密算法的类型。只需调用静态的创建方法,相应的抽象基类的:SymmetricAlgorithm AES;如对称(机密密钥)加密算法AsymmetricAlgorithm对非对称(公钥)加密算法(例如RSA);KeyedHashAlgorithm的键控哈希值;和HMAC基于哈希的消息身份验证代码。此外可以使用加密的灵活性与一个自定义算法类如一种算法,CLR安全小组开发,并上载到CodePlex替换其中一个标准的.NET加密算法类。但是,建议高度编写您自己的自定义加密库。您自己的算法,包含一个ROT13后跟一个按位左移位并只猫的名称对的XOR似乎安全,但它将会带来一些难题的专家代码断字符。除非您是在加密方面的专家,将算法设计专业人士。此外抵御开发您自己的算法诱惑)或要恢复长时间的死,模糊的类似Vigenre密码-甚至在不需要加密型强的保护的情况下。问题不是那么多什么您但什么的开发人员有后您将使用它执行的您密码的。新开发人员在您的自定义算法类中查找代码基年以后可能决定只是他需要的内容的新产品激活的密钥生成逻辑。到目前为止我们见过用于实现灵活的加密代码,AlgorithmType.Create(algorithmName),语法之一,但其他两种方法都内置在Microsoft.NET Framework。第一个是使用System.Security.Cryptography.CryptoConfig类:复制代码private static byte computeHash(byte buffer)using(HashAlgorithm hash=(HashAlgorithm)CryptoConfig.CreateFromName(MyApplicationHash)return hash.ComputeHash(buffer);此代码执行相同的操作与使用HashAlgorithm.Create(MyApplicationHash)我们前一个示例:为字符串MyApplicationHash的一个重新映射machine.config文件中查找的CLR并使用remapped的算法类,如果它找到一个。请注意我们需转换CryptoConfig.CreateFromName的结果,因为它具有System.Object的返回类型,并可用于创建SymmetricAlgorithms、AsymmetricAlgorithms或任何其他类型的对象。第二个替代语法是调用静态算法创建方法,我们的原始示例但不带参数如下:复制代码private static byte computeHash(byte buffer)using(HashAlgorithm hash=HashAlgorithm.Create()return hash.ComputeHash(buffer);在此代码,我们只需询问框架提供的任何默认哈希算法实现的实例。可以在图2查找System.Security.Cryptography抽象基类(的.NET 3.5)的每个的默认值的列表。图2的默认算法和实现在.NET Framework 3.5中抽象基类默认算法默认实现HashAlgorithm SHA-1 SHA1CryptoServiceProvider SymmetricAlgorithm AES(Rijndael)RijndaelManaged AsymmetricAlgorithm RSA RSACryptoServiceProvider KeyedHashAlgorithm SHA-1 hmacsha1 HMAC SHA-1 hmacsha1为HashAlgorithm,您可以看到默认的算法是SHA-1,默认实现类SHA1CryptoServiceProvider。但是,我们知道SHA-1禁止SDL的加密标准。目前,为我们忽略这一事实潜在的兼容性问题使其通常unwise将重新像SHA1的固有的算法名称映射更改以重新映射SHA1我们machine.config将SHA512CryptoServiceProvider:复制代码cryptoClasses cryptoClass MyPreferredHash=SHA512CryptoServiceProvider,System.Core,Version=,Culture=neutral,PublicKeyToken=b77a5c 561934e089/cryptoClasses nameEntry name=SHA1class=MyPreferredHash/现在让我们来插入computeHash函数以确认的算法已正确地重新映射,然后运行应用程序中的调试行:复制代码private static byte computeHash(byte buffer)using(HashAlgorithm hash=HashAlgorithm.Create()Debug.WriteLine(hash.GetType();return hash.ComputeHash(buffer);调试输出从该方法为:复制代码System.Security.Cryptography.SHA1CryptoServiceProvider究竟发生了什么?我们不能重新映射SHA1 SHA到512之间吗?实际,不,我们没有。我们重新映射只能在字符串SHA1向类SHA512CryptoServiceProvider,和我们未通过字符串SHA1为HashAlgorithm.Create调用的一个参数。即使创建似乎没有字符串参数,以重新映射,就仍可以更改已创建的对象的类型。可以只是快捷方式语法HashAlgorithm.Create(System.Security.Cryptography.HashAlgorithm)HashAlgorithm.Create()是执行此操作。现在让我们将添加到以重新映射System.Security.Cryptography.HashAlgorithmmachine.config文件中其他行SHA512CryptoServiceProvider和然后运行该应用程序再次:复制代码cryptoClasses cryptoClass MyPreferredHash=SHA512CryptoServiceProvider,System.Core,Version=,Culture=neutral,PublicKeyToken=b77a5c 561934e089/cryptoClasses nameEntry name=SHA1class=MyPreferredHash/nameEntry name=System.Security.Cryptography.HashAlgorithmclass=MyPreferredHash/调试输出从computeHash正是现在我们的预期:复制代码System.Security.Cryptography.SHA512CryptoServiceProvider但是,请记住重新映射的类,这种方式可以创建意外和难以调试的兼容性问题。是特定于应用程序的友好名称可以被重新映射使用较少导致问题的机会更可取。加密灵活性的另一个好处除了让您替换而无需重新编译的动态中断的算法,加密灵活性可用于提高性能。如果以前已经看System.Security.Cryptography命名空间,您可能已经注意到通常几个不同的实现类存在一个给定的算法。渚嫔的方式有SHA到512之间的三个不同的实现:SHA512Cng、SHA512CryptoServiceProvider和SHA512Managed。这些类,SHA512Cng通常提供了最佳的性能。在我的便携式计算机(运行Windows 7候选发布)快速测试所显示 Cng类通常10%更快-CryptoServiceProvider和托管类。我的同事核心体系结构组中通知我在某些情况下 Cng类可以实际运行的10倍比其他更快!清楚地,使用 Cng类最好,并将我们可以设置我们machine.config文件重新映射算法使用这些的类的实现,但-Cng类上不支持每个操作系统。仅Windows Vista,Windows Server 2008,和Windows 7(及更高版本,大概)支持 Cng。尝试实例化 Cng类在任何其他操作系统上的,则将引发异常。同样, Managed系列的加密类(AesManaged、RijndaelManaged、SHA256Managed,等)并不总是可用,但完全不同的原因。在联邦信息处理标准140(FIPS)指定标准的加密算法和实现。在撰写本文 Cng和 CryptoServiceProvider实现类FIPS认证但 Managed类不。此外,您可以配置允许仅符合FIPS的算法使用的组策略设置。某些美国和加拿大的政府机构要求此策略设置。如果您想要检查您的计算机,打开本地组策略编辑器(gpedit.msc),定位到该计算机配置/Windows设置/安全设置/本地策略/安全选项节点并检查设置的值系统加密:使用FIPS兼容算法来加密,哈希,和签名。如果此策略设置为启用,但试图实例化 Managed类在该计算机上的将引发异常。这为能保证在所有的平台上的工作最小公分离开 CryptoServiceProvider系列类的但这些类也通常最差的性能。您可以通过实现前面所述这三个加密的灵活性语法之一来解决此问题文章和自定义重新在machine.config文件映射为部署基于其镎崭綔绯荤粺和设置的计算机。计算机运行的Windows Vista或更高版本,我们可以重新映射到喜欢 Cng实现类machine.config:复制代码cryptoClasses cryptoClass MyPreferredHash=SHA512Cng,System.Core,Version=,Culture=neutral,Publ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论