Будут ли хеш-строки, возвращаемые веб-службой .NET и приложением Android, одинаковыми

Я реализовал веб-службу (.asmx) с использованием .NET Framework, которая возвращает мне хеш-строку.

Вот код:

     public 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;
    }

В моем приложении для Android я беру пароль от пользователя через EditText и снова хэширую его с помощью алгоритма SHA-1. Учитывая тот факт, что я предоставляю один и тот же пароль как в коде C #, так и в коде Android, будут ли хеш-строки, возвращаемые обоими, равными?

Фрагмент кода Android:

  private static String bytesToHexString(byte[] bytes) 
     {

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(0xFF & bytes[i]);
            if (hex.length() == 1) {
                sb.append('0');
            }
            sb.append(hex);
        }
        return sb.toString();
    }

// generate a hash
  public void Sha(String password)
  {
    MessageDigest digest=null;
    String hash;

    try {
        digest = MessageDigest.getInstance("SHA-1");
        digest.update(password.getBytes());

        hash = bytesToHexString(digest.digest());

        Log.i("Eamorr", "result is " + hash);
    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

  }

Моя основная цель - в основном сравнить хэш-строки в обоих случаях и, если они равны, отобразить сообщение о том, что «Пользователь действителен».

Может ли кто-нибудь помочь мне в этом?

заранее спасибо


person Parth Doshi    schedule 22.11.2011    source источник


Ответы (1)


Необработанные данные SHA-1 будут одинаковыми, но похоже, что ваша кодировка для печати отличается: Base64 на сервере, Hex (Base16) на устройстве. Вам нужно использовать одно и то же на обоих (или, по крайней мере, иметь возможность декодировать оба, прежде чем сравнивать биты).

person Thilo    schedule 22.11.2011
comment
хорошо, тогда я буду использовать Base16 на сервере и напишу эту строку rethash = Convert.ToBase16String(hash.Hash); ..это будет хорошо? - person Parth Doshi; 22.11.2011
comment
Должно быть. Может быть, незначительные вещи, такие как отступы или верхний/нижний регистр. Просто попробуйте, и если это не выглядит совершенно по-другому, вы сможете работать оттуда. - person Thilo; 22.11.2011
comment
Я пытался, но .NET не содержит определения для Convert.ToBase16String().. я получаю сообщение об ошибке.. так что теперь, как сделать код Android как base64? - person Parth Doshi; 22.11.2011