4

C# に SHA-1 で暗号化された値を渡していることを発見した PHP Web サービスがあります。渡されたサンプル データは "8cb2237d0679ca88db6464eac60da96345513964" で、これは "12345" に変換されます。

次のようなコードを使用して、ハッシュ値を「12345」に戻すにはどうすればよいですか

public static string HashCode(string str)
{
string rethash = "";
try
{

      System.Security.Cryptography.SHA1 hash = System.Security.Cryptography.SHA1.Create();
       System.Text.ASCIIEncoding encoder = new System.Text.ASCIIEncoding();
       byte[] combined = encoder.GetBytes(str);
       hash.ComputeHash(combined);
       rethash = Convert.ToBase64String(hash.Hash);
}
catch (Exception ex)
{
       string strerr = "Error in HashCode : " + ex.Message;
}
return rethash;
}
  • 編集 *

これは、「8cb2237d0679ca88db6464eac60da96345513964」および「12345」でも機能するRUBYコードです。

require "digest/sha1"
class User
  attr_accessor :password
  def initialize(password)
    @password = hash_password(password)
  end
  def hash_password(password)
    Digest::SHA1.hexdigest(password)
  end
  def valid_password?(password)
    @password == hash_password(password)
  end
end
u = User.new("12345")
p u.password # => "8cb2237d0679ca88db6464eac60da96345513964"
p u.valid_password?("not valid") # => false
p u.valid_password?("12345") # => true
4

6 に答える 6

6

SHA1 ハッシュは一方向ハッシュであるため、復号化できません。

一方向ハッシュのもう 1 つの例は MD5 です。

于 2013-01-31T16:31:47.117 に答える
4

12345 は常に 8cb2237d0679ca88db6464eac60da96345513964 とストレート ハッシュになります。

これは、考えられるすべての結果のデータベースを作成した場合、理論的には結果を調べて、そこから sha1 関数への元の入力が何であったかを確認できることを意味します。

これはセキュリティ上の問題であり、辞書攻撃やレインボー テーブルなどの問題が発生する可能性があります ( http://en.wikipedia.org/wiki/Rainbow_table )。

これを回避するには、ソルトなしのハッシュを使用しないでください。つまり、既知の値を使用して常にハッシュをカスタマイズします。

たとえば、sha1("12345" + "mySalt") です。

これで、ハッシュは簡単に計算できますが、sha1 を使用した世界中の他のすべての人と同じではありません。

技術的に言えば、同じソルトを 2 回も再利用するべきではありませんが、それはより複雑な概念です。

EDIT : owlstead が以下で指摘しているように、静的ソルトとハッシュではなく、PBKDF2 とランダム ソルトを使用する必要があります。セキュリティに関してははるかに優れています。

于 2013-01-31T17:04:52.603 に答える
4

あなたが投稿したルビーコードは、ハッシュを逆にしていないようです。

それがしているように見えるのはこれです:

パスワード テキストを取得し、ハッシュして保存します。

後で、「ユーザー」が同じパスワードを再度入力したことを確認したい場合、ユーザーからパスワード テキストを取得し、それをハッシュして、ハッシュ値を保存されているハッシュ値と比較します。

これは、パスワードを保存および確認するための一般的な方法です。保存された値を比較のために「デハッシュ」する代わりに、新しい値をハッシュして、2 つのハッシュ値を比較します。

于 2013-01-31T17:05:02.430 に答える
2

あなたが探しているコードはこれです

SHA1 sha = new SHA1CryptoServiceProvider();
ASCIIEncoding encoder = new ASCIIEncoding(); 
byte[] combined = encoder.GetBytes(pin);
string hash = BitConverter.ToString(sha.ComputeHash(combined)).Replace("-", "");

ピンはハッシュされていない値で、ハッシュ比較する値です

于 2013-03-24T19:22:51.597 に答える
1

ハッシュは暗号化ではありません。ハッシュは 1 つの方法であり、ほとんどの場合、データの整合性を検証するために使用されます。

于 2013-01-31T16:33:28.920 に答える
1

ハッシュは、暗号化のように可逆的な操作ではありません。

于 2013-01-31T16:32:58.470 に答える