我经常制作小型网站并使用 SQL Server 数据库中内置的 ASP.NET 成员功能,使用默认的“散列”密码存储方法。
我想知道是否有一种方法可以通过在客户端散列密码而不是在不使用 SSL 的情况下通过网络以明文形式发送密码来对用户进行身份验证。
我知道这只适用于启用了 Javascript 的用户。
或者...可能,这将是 Silverlight 的一个很棒的内置功能(这在 Silverlight 路线图中吗?)
编辑: 我也在寻找“安全等级”。意思是,如果有一种方法比简单地发送明文密码有一些优势,我想知道它们是什么以及为什么。
我知道有很多人在做需要登录的小型网站(例如家庭网站或志愿为本地 cooking 俱乐部创建网站)并且认为没有必要购买 SSL 证书。
最佳答案
这是可能的。这实际上就是 Kerberos 身份验证所做的,只是添加了一点点香料。为确保您的身份验证机制安全,您需要满足以下条件:
要通过哈希码安全地验证用户身份,从而避免通过网络发送实际密码,请首先在服务器上生成一个随机的一次性盐值。将此加盐值发送到客户端,并根据用户输入的加盐版本密码生成哈希码。将生成的散列码发送到服务器,并将其与存储密码的加盐版本生成的散列码进行比较。如果比较失败,则丢弃盐,重新生成新的盐值,并重复该过程。
使用一次性盐的原因是为了防止任何收听对话的人捕获用户密码的哈希码,当您使用哈希码比较时,这与拥有密码本身一样好。
请注意,您需要保留原始密码,您不能在服务器上对它进行一次散列并将散列保存在数据库中。如果您需要确保存储在数据库中的密码也是安全的,那么您需要在存储它们之前对其进行加密。我相信 ASP.NET 成员资格提供程序确实允许您存储加密的密码,但是,如果您真的希望拥有黑客难以破解的安全身份验证机制,那么我建议您完全自己处理密码存储和检索.
最后,我应该指出,如果您在身份验证期间使用 SSL 来加密您的连接,那么这种复杂的密码传输机制在很大程度上是不必要的。
引用资料(对于那些从未听说过 Kerberos 或 SRP 的人):
http://en.wikipedia.org/wiki/Kerberos_(protocol) http://en.wikipedia.org/wiki/Secure_remote_password_protocol
关于asp.net - 是否可以散列密码并验证用户客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1088000/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou