3

私の問題は少し毛深いです、そして私は間違った質問をしているかもしれません、それで私に耐えてください...

メンバーシップシステムのユーザーパスワードとソルトを保存するレガシーMySQLデータベースがあります。これらの値は両方とも、Rubyフレームワークを使用してハッシュされています-大まかに次のようになります。

hashedsalt = Digest :: SHA1.hexdigest( "-#{Time.now.to_s}-#{login}-")

hashedpassword = Digest :: SHA1.hexdigest( "#{hashedsalt}:#{password}")

したがって、両方の値はMySQLに40文字の文字列(varchar(40))として格納されます。

次に、これらすべてのユーザーを、SQLServerデータベースを使用する新しいWebサイトのASP.NETメンバーシップフレームワークにインポートする必要があります。ASP.NETメンバーシップを構成する方法では、ユーザーパスワードとソルトもSHA1ハッシュとしてメンバーシップデータベース(テーブルaspnet_Membership)に保存され、Base64でエンコードされ(詳細はこちらを参照)、保存されることを理解しています。 nvarchar(128)データとして。

しかし、格納されているBase64でエンコードされた文字列の長さ(28文字)から、ASP.NETメンバーシップが生成するSHA1ハッシュの長さは40文字ではなく20文字しかないようです。文字/文字セット/エンコーディングまたは関連するものごとのビット数と関係があります。

では、40文字のSHA1ハッシュを20文字のハッシュに変換して、新しいASP.NETメンバーシップデータテーブルに転送する方法はありますか?私は今ではASP.NETメンバーシップにかなり精通していますが、この1つが欠けているように感じます。ただし、RubyのSHA1と.NETのSHA1には互換性がないこともわかっている可能性があるため、負け戦を戦っています...

洞察を事前に感謝します。

4

2 に答える 2

2

Rubyアプリのvarchar表現は、「文字列としてのhex」のように見えます。次のようになります01AB02EF...23EF。つまり、各バイトは、00からFFまでのバイトの16進値である文字のペアとして表されます。したがって、SHAハッシュ(20バイト)は40文字で表されます。ハッシュが値(0、1、2、...)の場合、文字列は000102になります。ASPbase64は、実際のバイトの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コードが作成したソルトハッシュを使用するように強制することは、ハッシュダイジェストの格納に使用されるエンコードとは関係なく、まったく別のトピックです。独自のメンバーシッププロバイダーを書き直す必要がある可能性があります。その時点で、ストレージエンコーディングは、必要に応じて保存できるため、無関係になります。

于 2010-03-17T23:14:41.523 に答える
1

RubyはSHA2を使用し、ASP.NETはSHA1を使用します。いいえ、これらのバージョン間で「変換」することはできません。そのためには、平文からハッシュを再計算する必要があります。

編集:SHAは標準化されているため、インターネットでASP.NETで使用するSHA2ライブラリを検索できます。

于 2010-03-17T22:50:31.297 に答える