0

タイトルがあなたを怖がらせなかったことを願っています。Ruby を使用して sha1 ハッシュを作成していますが、他のシステムがハッシュを作成するために使用する式に従う必要があります。

Ruby経由で次のことを行うにはどうすればよいですか? 私はうまくハッシュを作成しています - しかし、フォーマットが私を混乱させています - Ruby 標準ライブラリに同等のものがあるかどうか知りたいです。

システム セキュリティ暗号化 (MSDN)

Ruby に変換しようとしている C# コードを次に示します。ハッシュをうまく作成していますが、「String.Format("{0,2:X2}」の部分についてはわかりません。

//create our SHA1 provider
SHA1 sha = new SHA1CryptoServiceProvider();

String str = "Some value to hash";
String hashedValue; -- hashed value of the string

//hash the data -- use ascii encoding
byte[] hashedDataBytes = sha.ComputeHash(Encoding.ASCII.GetBytes(str));

//loop through each byte in the byte array 
foreach (byte b in hashedDataBytes) 
{
   //convert each byte -- append to result
   hashedValue += String.Format("{0,2:X2}", b); 
}
4

1 に答える 1

2

特定のデータの SHA1 ハッシュは、常に同じハッシュ (実質的には単に大きな数) です。唯一の違いは、他のシステムに送信するなど、どのようにフォーマットする必要があるかです。特にあいまいなシステムはデータを後処理する可能性がありますが、データを切り捨てたり、代替バイトのみを取得したりします。

C# コードを読んだ大まかな推測では、これは標準的な 40 文字の 16 進文字列になります。したがって、Ruby での私の最初の考えは次のとおりです。

require 'digest/sha1'
Digest::SHA1.hexdigest("Some value to hash").upcase

. . . ただし、Latin-1 または UTF-8 文字列などで始まる場合、C# の ascii 形式への強制がどうなるかはわかりません。これらは、C# が例外をスローすることだけを確認する場合に役立つ入力例です。Ruby バージョンの文字エンコーディングについて心配する必要があるかどうかがわかります。SHA1 へのデータ入力は文字ではなくバイトであるため、使用するエンコーディングと変換方法は問題の一部です。

私の現在の理解では、Encoding.ASCII.GetBytes は文字番号 127 を超えるものを強制的に「?」にするため、Ruby で .gsub などを使用してそれをエミュレートする必要があるかもしれません。データソース。

于 2013-03-21T21:26:15.053 に答える