2

さて、さまざまなフレームワークやライブラリ、インターネットで見つけたものを使用する前に解決した問題に時々遭遇し、問題は比較的迅速かつ簡単に解決され、問題が最初に問題であった理由もわかります。場所。

ただし、絶対に 0 の意味を持つ問題に遭遇することもあれば、解決策が否定的な意味を持つ場合はさらに悪いことになります。

Data私の問題は、それから MD5 ハッシュを取得して作成したいということです。

あらゆる種類の解決策を見つけましたが、どれも機能しません。

実際に私を本当に悩ませているのは、何かから MD5 ハッシュを取得するという簡単なタスクに対して、ソリューションが不必要に複雑に見えることです。

CryptoCommonCryptoフレームワークを使用しようとしていますが、Soffesかなり簡単に思えますよね? 右?

はい!

しかし、なぜまだエラーが発生するのfatal error: unexpectedly found nil while unwrapping an Optional valueですか?

私が理解していることから、bymyData.md5の拡張子で提供されるデータは「オプション」のようです。しかし、なぜ?CryptoSoffes

私が実行しようとしているコードは次のとおりです。

print(" md5 result: " + String(data: myData.md5, encoding: .utf8)!)

myData上記のコード行の後、そのデータをサーバーに送信すると、データが存在するため、どこにデータが 100% 含まれています。

その上、myData.md5.countbyのカウントを表示すると、print(String(myData.md5.count))完全に機能します。

したがって、私の質問は基本的に次のとおりです。データをMD5ハッシュして文字列として出力するにはどうすればよいですか?

編集:

私が試したこと

それはうまくいく

MD5: testPHPスクリプトで文字列を実行する098f6bcd4621d373cade4e832627b4f6 と、Swiftコード"test".md5()でも得られます098f6bcd4621d373cade4e832627b4f6

それはうまくいきません

UInt8からのバイト配列をData.md5()、正しい MD5 値を表す文字列に変換します。

私が行ったさまざまなテストは次のとおりです。

var hash = ""
for byte in myData.data.md5() {
    hash +=  String(format: "%02x", byte)
}
print("loop = " + hash) //test 1

print("myData.md5().toHexString() = " +  myData.md5().toHexString()) //test 2

print("CryptoSwift.Digest.md5([UInt8](myData)) = " + CryptoSwift.Digest.md5([UInt8](myData)).toHexString()) //test 3

500 バイトのテスト データを使用した 3 つのテストすべてで MD5 値56f6955d148ad6b6abbc9088b4ae334d が得られ、PHP スクリプトでは6081d190b3ec6de47a74d34f6316ac6b

テスト サンプル (64 バイト): 生データ:

FFD8FFE0 00104A46 49460001 01010048 00480000 FFE13572 45786966 00004D4D
002A0000 0008000B 01060003 00000001 00020000 010F0002 00000012 00000092

テスト 1、2、および 3 MD5:7f0a012239d9fde5a46071640d2d8c83

PHP MD5:06eb0c71d8839a4ac91ee42c129b8ba3

PHP コード:echo md5($_FILES["file"]["tmp_name"])

4

3 に答える 3

1

あなたの質問に対する簡単な答えは次のとおりです。

String(data: someData, encoding: .utf8)

が適切に UTF8 エンコードされたデータでないnil場合に返します。someData次のようにアンラップしようとするとnil:

String(data: someDate, encoding: .utf8)!

あなたが得る:

致命的なエラー: オプション値のラップ解除中に予期せず nil が見つかりました

つまり、本質的に、ハッシュや暗号とは何の関係もありません。

MD5 (またはそれに関する任意のハッシュ アルゴリズム) の入力と出力はどちらもバイナリ データです (テキストや文字列ではありません)。したがって、MD5 の出力は UTF8 でエンコードされたデータではありません。したがって、上記の文字列初期化子が常に失敗する理由.

コンソールにバイナリ データを表示する場合は、それを読み取り可能な表現に変換する必要があります。最も一般的なものは、16 進数または Base 64 エンコーディングです。

注: 一部の暗号化ライブラリでは、ハッシュ関数に文字列をフィードできます。文字エンコーディングを使用して、文字列をバイナリ表現に静かに変換します。エンコーディングが一致しない場合、ハッシュ値はシステム間およびプログラミング言語間で一致しません。したがって、バックグラウンドで実際に実行する理由を理解しようとする方がよいでしょう。

于 2016-11-29T18:01:47.003 に答える
0

「CryptoSwift」というライブラリを使用して、ハッシュを作成し、データを送信/保存する前に暗号化します。使い方はとても簡単です。

https://github.com/krzyzanowskim/CryptoSwiftで見つけることができ、podfile に追加することで CocoaPods と共にインストールすることもできpod 'CryptoSwift'ます。

インストールが完了すると、オブジェクトのハッシュは!Dataを呼び出すのと同じくらい簡単です。Data.md5()本当に簡単です。などの他のハッシュアルゴリズムもサポートしていSHAます。

その後、オブジェクトを印刷するだけでMD5、CryptoSwift がそれを String に変換します。

ダイジェストの作成に関する完全なドキュメントは、https ://github.com/krzyzanowskim/CryptoSwift#calculate-digest にあります。

于 2016-11-29T07:11:37.463 に答える
0

Jacob King のおかげで、CryptoSwift と呼ばれる、はるかに単純な MD5 フレームワークを試しました。

ユーザー Codo は、私が実際にデータのコンテンツをハッシュしているのではなく、正しいファイル名をハッシュしていると示唆したため、PHP スクリプトをさらに詳しく調べるように促しました。

ただし、元の質問は、使用するフレームワークや、アプリと PHP スクリプトが異なる MD5 値を返す理由に関する提案ではありませんでした。

質問はもともと、なぜエラーが発生するのかについてでした

致命的なエラー: オプション値のラップ解除中に予期せず nil が見つかりました

コードの行で

print(" md5 result: " + String(data: myData.md5, encoding: .utf8)!)

その答えは、関数の 16 バイトのデータ出力を変換しようとするのではなく、その代わりにcalledMD5()のサブ関数を呼び出すべきだということです。MD5()toHexString()

したがって、適切なコード行は次のようになります。

print("md5 result: " + myData.md5().toHexString())

ボーナス

PHP スクリプトに次のコードが含まれるようになりました。

move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir); //save data to disk
$md5_of_data = md5_file ($target_dir); //get MD5 of saved data

BONUS-BONUS 問題と解決策は、私が取り組んでいる AssetManager と呼ばれる小さなフレームワークの一部です

于 2016-11-29T15:40:34.773 に答える