0

ネイティブ iPhone アプリケーションから C# サービスと通信しようとしています。入力されたパスワードを伝達するには、ハッシュ化して、サーバーに保存されているハッシュ化されたバージョンと比較する必要があります。私は Objective C で C# ハッシュを再作成しようとしていますが、それが興味深いところです。

目的の C コード:

NSString * password = @"testPass123";
const char *cPassword = [password UTF8String];    

NSString * key = @"Garbage12345";
NSData * keyData = [NSData dataFromBase64String:key];
NSUInteger len = [keyData length];
unsigned char * cKey = (unsigned char *)malloc(len);
memcpy(cKey, [keyData bytes], len);

// Concatenate into one byte array
unsigned char totalString[18];
for (int i = 0; i < strlen(cPassword); i++) {
    totalString[i] = cPassword[i];
}

for (int i = 0; i < len; i++) {
    totalString[strlen(cPassword) + i] = cKey[i];
}

// DEBUG: Display byte array
for (int i = 0; i < 18; i++) {
    NSLog(@"totalString: %x", totalString[i]);
}

// **** totalString == plainTextWithSaltBytes from the C# portion ****
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(totalString, CC_MD5_DIGEST_LENGTH, result);

for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
    NSLog(@"result: %02x", result[i]);
}

C# コード:

byte[] SaltBytes = Convert.FromBase64String("Garbage12345");

// Convert plain text into a byte array.
byte[] plainTextBytes = Encoding.UTF8.GetBytes("testPass123");

// Allocate array, which will hold plain text and salt.
byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + SaltBytes.Length];

// Copy plain text bytes into resulting array.
for (int i = 0; i < plainTextBytes.Length; i++)
    plainTextWithSaltBytes[i] = plainTextBytes[i];

// Append salt bytes to the resulting array.
for (int i = 0; i < SaltBytes.Length; i++)
    plainTextWithSaltBytes[plainTextBytes.Length + i] = SaltBytes[i];

HashAlgorithm hash = new MD5CryptoServiceProvider();

// **** plainTextWithSaltBytes == totalString from the Obj-C portion ****
// Compute hash value of our plain text with appended salt.
byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);

// Convert result into a base64-encoded string.
string hashValue = Convert.ToBase64String(hashBytes);

いずれかの MD5 部分に入る前に、バイト配列に対して同じ結果が返されます。提供されたダミーデータを使用して、次を返します。

74
65
73
74
50
61
73
73
31
32
33
19
aa
db
6a
07
b5
db

ただし、後で別の値が返され、そこからどこに行くべきかわかりません。

誰にもアイデアはありますか?私が間違っていることも遠慮なく指摘してください。ありがとう。

4

1 に答える 1

1

あなたのバグは、 の 2 番目のパラメーターがCC_MD5出力の長さではなく、入力でなければならないことだと思います。入力の長さを渡すと、差し迫った問題が解決するはずです。

ただし、両側のコードを破棄し、パスワードハッシュ用に設計された関数を使用する必要があると思います。PBKDF2 や bcrypt など。

ハッシュをサーバーに送信するのも奇妙です。通常、パスワードをサーバーに送信し、そこでハッシュします。ハッシュを送信すると、本質的にパスワードの定義が変更され、パスワードを知らないがハッシュを知っている攻撃者のログインが可能になります。

于 2012-04-16T22:33:13.577 に答える