解决md5不是windows平台FIPS验证的加密算法的一部分的怪异问题
一. 发生问题
临近下班时间的下午,领导一句话:项目先上到测试服吧,我明早来看看。
我想项目还没做完,先上到测试服务器,简单看下应该是没什么问题,部署也只是一会儿的事嘛,随后把手头的项目编译,发布,拷到远程服务器上,IIS配置一下,各类服务装一下,在浏览器中输入地址,成功进入登录界面,输入正确的帐号密码,却发现登录不了,what,什么鬼?
二. 查找原因
因为项目在本地是正常的,于是找到日志,发现了问题所在
原因是用户的登录密码加密方式用的是md5,而md5并不是FIPS(Federal Information Processing Standards 即(美国)联邦信息处理标准)中的一个部分
三. 尝试解决问题
于是打开某度,输入上面的错误,满屏的全匹配红色关键字扑面而来,看来有这问题的人还真多,瞬间觉得有救了
主要原因就是系统的组策略安全设置开启了FIPS导致无法使用MD5算法,秉着志在必得的心情,按照网友们的解决办法去弄了一遍,不外乎就两种方式:
第一种:到系统的组策略安全设置中把FIPS禁用掉
步骤:
1.按 WIN+R(或点击开始-运行),并输入gpedit.msc后确定,启动组策略编辑器。
2.左侧列表中找到 计算机配置 - Windows设置 - 安全设置 - 本地策略 - 安全选项,并在右侧找到“系统加密:将FIPS兼容算法用于加密、哈希和签名”,设置为禁用
第二种:修改注册表
步骤:
1.按WIN+R(或点击开始-运行),并输入 后确定,启动注册表编辑器。
2.浏览到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy
,将Enabled
的值改为0
经过上面两种方法尝试后发现居然还是不行!!!,众多教程几乎全都是这两种解决办法,为什么我不行!!
思考片刻,我想国内找不到,国外总有吧,这时候打开了某歌,输入错误信息。。。等等,外国人是用英文的,于是先去找到了错误信息对应的英文翻译(This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms),搜索,又是一片,呵呵
在浏览多个页面的过程中,不经意间就进到巨硬msdn的一个页面,终于又发现了两个解决方法:
1. 升级系统补丁,或者找到一个名叫KB935434的补丁(这个补丁根本已经找不到了好么)
2. 在webconfig加入一段配置,可以绕过FIPS的验证 (一点用没有。。。)
参考页面:https://blogs.msdn.microsoft.com/dataaccesstechnologies/2015/07/16/report-manager-system-invalidoperationexception-this-implementation-is-not-part-of-the-windows-platform-fips-validated-cryptographic-algorithms/
四. 解决问题
经过上面所有的尝试,包括重启,反复尝试,寻找方案,各种技术群询问,已经过去了3个多小时,我已经有点崩溃
突然想到上面说的系统补丁,我想会不会是系统的原因,服务器的系统是win server 2008 r2 sp1 ,我去翻看了我本机电脑的注册表,发现是有不同的,我甚至还把本机注册表里有的项,而服务器里没有的,全给它建上去了,还是不行!
会不会是系统不同,读取的目录是不同的,或者说这个FIPS开关是会有多个的??
于是我尝试着在注册表里全局搜索FipsAlgorithmPolicy这个关键字,一项一项的查找,最后定位到了一个仅有一层父级目录不同,但是其他目录结构,名字一模一样的项
把里面的项改成0,马上去登录帐号,通过了!!!
果然系统不同,读取的注册表目录是会有差别的。。。
五. 总结
有时候项目在本机是没问题的,但是发布到服务器上后总会出现一些奇怪的问题,这是经常发生的事情,大家都懂的。但是发生了问题,肯定是需要去解决的,首先,代码里做好基本的错误日志记录肯定是需要的,再找到解决方案,发现不可用之后,需要冷静下来,思考为什么会发生这样的问题,然后可以根据现有的解决办法延伸出去,多方位去判断原因,并尝试去动手,花时间不重要,重要的是累积经验,以后就可以少踩一些坑了。