我的问题有点毛病,可能问错了问题,还请多多包涵...
我有一个遗留的 MySQL 数据库,用于存储成员(member)系统的用户密码和盐。这两个值都已使用 Ruby 框架进行了哈希处理 - 大致如下:
hashedsalt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--")
hashedpassword = Digest::SHA1.hexdigest("#{hashedsalt}:#{password}")
所以这两个值在 MySQL 中都存储为 40 个字符的字符串 (varchar(40))。
现在我需要将所有这些用户导入到一个使用 SQL Server 数据库的新网站的 ASP.NET 成员资格框架中。据我了解,我配置 ASP.NET 成员资格的方式,用户密码和盐也作为 SHA1 哈希值存储在成员资格数据库中(在表 aspnet_Membership 中),然后对其进行 Base64 编码(有关详细信息,请参见 here)并存储为 nvarchar(128) 数据。
但是从存储的 Base64 编码字符串的长度(28 个字符)来看,ASP.NET 成员资格生成的 SHA1 哈希值似乎只有 20 个字符长,而不是 40 个字符。从其他一些阅读我一直在做的我我认为这与每个字符/字符集/编码或相关内容的位数有关。
那么有什么方法可以将 40 个字符的 SHA1 哈希值转换为 20 个字符的哈希值,然后我可以将其传输到新的 ASP.NET 成员数据表中?我现在非常熟悉 ASP.NET 成员资格,但我觉得我只是错过了这一点。然而,也可能知道 Ruby 中的 SHA1 和 .NET 中的 SHA1 是不兼容的,所以我正在打一场失败的战斗......
提前感谢您的任何见解。
最佳答案
您的 Ruby 应用程序中的 varchar 表示形式似乎是“十六进制字符串”,类似于:01AB02EF...23EF。也就是说,每个字节都表示为一对字符,它们是字节的十六进制值,从 00 到 FF。因此,SHA 散列(20 个字节)表示为 40 个字符。如果散列是值 (0, 1, 2, ...),则字符串将为 000102。ASP base64 是实际字节的 base64 编码。所以你需要做的就是把MySQL的字符拿到对应的字节,然后编码成base64。
您实际上可以在 SQL 本身中进行转换:
declare @x varchar(40);
set @x = '000102030405060708090A0B0C0D0E0F10111213';
declare @sql nvarchar(max);
set @sql = N'set @out=0x' + @x;
declare @out varbinary(20);
exec sp_executesql @sql, N'@out varbinary(20) output', @out output;
select @out for xml path('');
但是要强制您的 ASP.Net 成员提供者使用您的 Ruby 代码创建的加盐哈希,与用于存储哈希摘要的编码无关,那是一个完全不同的话题。您可能必须重写自己的成员资格提供程序,此时存储编码变得无关紧要,因为您可以按照自己的意愿存储它们。
关于asp.net - 是否可以将 40 个字符的 SHA1 哈希转换为 20 个字符的 SHA1 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466443/
作为我的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
是的,我知道最好使用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
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>