2012-05-11 8 views
6

現在、私は、データベース行に基づく入学用のクレジットカードスワイプを含むプロジェクトに取り組んでいます。コール・システムと同様に、CC番号のSHA-256ハッシュは、「適切なピックアップ」とみなされるために、DB行のハッシュと一致しなければなりません。SHA-256ハッシュはC#とJavascriptの間で異なります

しかし、ボックスオフィスシステムはブラウザに基づいているため、ピックアップ時のCC番号はJavascriptを使用してクライアントサイドでハッシュし、以前にダウンロードしたコールデータと比較する必要があります。

ただし、数値をハッシュしようとすると、ハッシュはDB行が作成されたとき(ハッシュ化されたもの)とは異なる結果に終わります(VB.NETとSQL Server 2008 R2を使用)。たとえば、データベースのCC番号がの場合、.NETの結果ハッシュはxU6sVelMEme0N8aEcCKlNl5cG25kl8Mo5pzTowExenM =になります。

私は見つけることができるのJavascriptのための任意のSHA-256ハッシュライブラリを使用している場合しかし、結果のハッシュは常にNbjuSagE7lHVQzKSZG096bHtQoMLscYAXyuCXX0Wtw0 =だろう。

私はこれが何らかのUnicode/UTF-8の問題であると仮定していますが、何を試しても、ハッシュが同じになることはできません。それが私を狂わせてしまいます。誰も助言を提供することはできますか?

ここにいくつかの洞察力を提供するかもしれないものがあります。 http://www.insidepro.com/hashes.php?lang=engにアクセスし、[4444333322221111]を引用符なしで[パスワード]ボックスに挿入してください。その後、SHA-256セクションまでスクロールダウンします。

4つの結果があることがわかります。そのうち2つは、私が投稿したハッシュコードです(上から2番目はJavascriptハッシュ、下の1つはSQLハッシュです)。そのページによれば、下位ハッシュ結果は、基本64文字列を使用して生成され、パスワードをユニコード形式にする。

私はこれを調べて、パスワードをユニコード形式にエンコードするためにさまざまな機能を試しましたが、試したり、他の機能を試しても、必要なハッシュコードと一致することはありませんでした。

現在、サーバー側でSHA-256関数を呼び出すときに使用されるパラメータを調べています。

UPDATE:

は、だから、私はクレイジーではなかったことを確認するために、私は、デバッグ中に、私はすぐにウィンドウ内のCC番号を使用しているハッシュ法を走りました。再び、結果は以前と同じです。ここでのスクリーンショットを見ることができます:http://i.imgur.com/raEyX.png

+0

両側でハッシュをどのように達成したかに関する情報を提供できますか?どのような関数、コードなど... – JaredPar

+0

[Java SHA256はPHP SHA256と異なるハッシュを出力しますか?](http://stackoverflow.com/questions/4680661/java-sha256-outputs-different-hash-to- php-sha256) –

+0

いくつかのコードを表示しますか?私はこのSHA512を使用しています:http://pajhome.org.uk/crypt/md5/sha512.htmlと私は以前このSHA-1を使いました:http://www.movable-type.co.uk/scripts/sha1。 htmlとC#interopの問題はありません。 (関連する質問:なぜsha512を使用しないのですか?) –

答えて

2

Adam Liss .NET/SQL Serverの文字列間のバイト配列がJavascriptの文字列と異なっていると言いました。文字列の.NETの配列は、[52 0 52 0 52 0 52 0 51 0 51 0 ...]のようになり、Javascriptの同じものは[52 52 52 52 51 51 51 51 ...]。したがって、異なるバイト配列では、異なるハッシュが生成されました。

ベース64のSHA-256ハッシングアルゴリズムをhereから変更して、これを修正することができました。各文字は、ハッシュを生成するために一度に1文字ずつ引き出されます。

このようにするのではなく、最初に文字列をUnicodeのようなバイト配列(上記の.NETの例のように52 0 52 0など)に変換し、その配列を各配列メンバを取得してハッシュを生成するために、いくつかの非常に微妙な微調整を行いました。私は、.NETフレームワークと同じようにCC番号をハッシングする非常に便利な方法を手早く簡単に検索することができます。

+1

.NET側でASCIIを扱っているかどうかを確認するには、 'Encoding.ASCII.GetBytes(" 4444333322221111 ")'を試してみたのかもしれません。暗号関数はテキストではなくバイトを扱うことを忘れないでください。エンコーディングを考慮しない限り、テキストとバイトのマッピングは1対1ではありません。 –

+0

ウィリアム、あなたはそれをどうやって共有していますか? – Jaans

0

JavaScript SHA256の機能は本当ですか?


最初に生成されたハッシュは?

SHA-256("4444333322221111"); // 35b8ee49a804ee51d5433292646d3de9b1ed42830bb1c6005f2b825d7d16b70d 

hex: 35b8ee49a804ee51d5433292646d3de9b1ed42830bb1c6005f2b825d7d16b70d 
HEX: 35B8EE49A804EE51D5433292646D3DE9B1ED42830BB1C6005F2B825D7D16B70D 
h:e:x: 35:b8:ee:49:a8:04:ee:51:d5:43:32:92:64:6d:3d:e9:b1:ed:42:83:0b:b1:c6:00:5f:2b:82:5d:7d:16:b7:0d 
base64: NbjuSagE7lHVQzKSZG096bHtQoMLscYAXyuCXX0Wtw0= 
+0

これはおそらくコメントになるはずです...詳細を編集するつもりがない限り。 –

+0

私はJavascriptに対して非常に多くの異なるSHA256メソッドを試しましたが、どれも正しいハッシュを返しませんでした。 –

+0

あなたはそれについて、@ウィリアム・トーマスを詳しく説明できますか? –

2

online SHA-256 hash calculatorbase-64 to hex decoderによると、それは正しくハッシュを計算していない.NET実装です。ハッシュ関数に渡すパラメータを再度確認することができます。

2つの信頼できない実装を扱う場合は、別の独立した実装を見つけて、正しい実装と一致するものを選択することをお勧めします。どちらか、またはfind some test vectors、実装を個別に検証してください。


EDIT:

迅速な実験を使用して、.NETから取得SHA-256ハッシュがhext列3400340034003400330033003300330032003200320032003100310031003100一致していることを示している - リトルエンディアン16ビット文字を。 ASCIIで渡すことを確認してください。

+0

面白い...私はそれを確認します、ありがとう。 –

関連する問題