10

ASP.NETアプリケーションからRubyonRailsアプリケーションに転送するユーザーの大規模なデータベース(〜200,000)があります。すべてのユーザーにパスワードのリセットを依頼したくないので、RubyでC#パスワードハッシュ関数を再実装しようとしています。

古い関数は次のとおりです。

public string EncodePassword(string pass, string saltBase64)
 {
     byte[] bytes = Encoding.Unicode.GetBytes(pass);
     byte[] src = Convert.FromBase64String(saltBase64);
     byte[] dst = new byte[src.Length + bytes.Length];
     Buffer.BlockCopy(src, 0, dst, 0, src.Length);
     Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
     HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
     byte[] inArray = algorithm.ComputeHash(dst);
     return Convert.ToBase64String(inArray);
 }

ハッシュ化されたパスワードとソルトの例は次のとおりです(使用されたパスワードは「password」でした)。

ハッシュ化されたパスワード: "weEWx4rhyPtd3kec7usysxf7kpk ="ソルト: "1ptFxHq7ALe7yXIQDdzQ9Q =="パスワード: "password"

次のRubyコードを使用します。

require "base64"
require "digest/sha1"


password = "password"
salt = "1ptFxHq7ALe7yXIQDdzQ9Q=="

concat = salt+password

sha1 = Digest::SHA1.digest(concat)

encoded = Base64.encode64(sha1)

puts encoded

正しいパスワードハッシュを取得していません(「weEWx4rhyPtd3kec7usysxf7kpk=」ではなく「+BsdIOBN / Vh2U7qWG4e + O13h3iQ =」を取得しています)。誰かが問題が何であるかを見ることができますか?

どうもありがとう

アーフォン

4

4 に答える 4

9

ちょっとした更新ですが、私の同僚がこれを解決しました:

require "base64"
require "digest"
require "jcode"


def encode_password(password, salt)
 bytes = ""
 password.each_char { |c| bytes += c + "\x00" }
 salty = Base64.decode64(salt)
 concat = salty+bytes
 sha1 = Digest::SHA1.digest(concat)
 encoded = Base64.encode64(sha1).strip()
 puts encoded
end
于 2009-02-11T11:56:30.220 に答える
3

私は、既存の .NET アプリを Ruby on Rails に移行する任務を負っています。以下のコードを使用して、.NET パスワード ハッシュを模倣しています。私は Ruby を初めて使用し、.NET についてまったく知りません。コードはできる限りきれいではないかもしれませんが、それは出発点です。

テストするには、これを Ruby スクリプトとして保存し、次のように実行します。

ruby スクリプト plain_text_password salt_in_base64

例えば

ruby dotNetHash.rb password123 LU7hUk4MXAvlq6DksvP9SQ==

require "base64"
require "digest"

# Encode password as double-width characters
password_as_text = ARGV.first
double_width_password = []
double_width_password = password_as_text.encode("UTF-16LE").bytes.to_a

# Unencode the salt
salt = Base64.decode64(ARGV[1])

# Concatenate salt+pass
salt_pass_array = []
salt_pass_array = salt.bytes.to_a + double_width_password

# Repack array as string and hash it. Then encode.
salt_pass_str = salt_pass_array.pack('C*')
sha1_saltpass = Digest::SHA1.digest(salt_pass_str)
enc_sha1_saltpass = Base64.encode64(sha1_saltpass).strip()
puts "Encoded SHA1 saltpass is " + enc_sha1_saltpass
于 2011-11-18T15:11:16.253 に答える
1

ソルトをエンコード解除してバイト表現に戻し、それをパスワードと連結してハッシュされたパスワード値を取得する必要があります。エンコーディングのソルト文字列を直接使用しているため (これは別のソルトです)、別のものにハッシュしています。

require "base64"
require "digest/sha1"
password = "password"
salt = Base64.decode64("1ptFxHq7ALe7yXIQDdzQ9Q==")
concat = salt+password
sha1 = Digest::SHA1.digest(concat)
encoded = Base64.encode64(sha1)
puts encoded
于 2009-02-09T23:01:33.187 に答える