DotNet Core - криптографические хеш-функции, возвращающие противоречивые результаты - PullRequest
3 голосов
/ 04 июля 2019

В моем приложении .Net Core (v2.x) есть очень простая функция, которая вычисляет хеш строки.Код выглядит следующим образом:

using System.Security.Cryptography;
using System.Text;

public static string CalculateMd5Hash(string input)
{
    using (var md5 = MD5.Create())
    {
        var inputBytes = Encoding.UTF8.GetBytes(input);

        var hashBytes = md5.ComputeHash(inputBytes);

        return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
    }
}

Я также написал довольно простой тест для него, и, похоже, он работает на моей машине с Windows.Он соответствует ожидаемому результату этого онлайн-хеш-калькулятора :

public void CalculateMd5Hash_CalculatesHashCorrectly()
{
    var hash = HashingUtility.CalculateMd5Hash("CreateMD5Hash_123_!£$%^&*");

    Assert.Equal("9a3e6e29cc3d1eae7d7a0df0a24a1deb", hash);
}

Проблема в том, что этот тест не пройден в нашем конвейере CI, который работает на машине с Linux, но я вроде какэто не должно иметь никакого значения, поскольку UTF-8 и шестнадцатеричные строки являются независимыми от платформы понятиями.

Expected: 9a3e6e29cc3d1eae7d7a0df0a24a1deb
Actual:   fb5f4b930ea2b600c6b976b954a56189

Любые идеи, что здесь происходит?

РЕДАКТИРОВАТЬ: я пытался что @DavidG предложил, но без удачи, точно такой же результат.Вот обновленная версия хэш-функции:

public static string CalculateMd5Hash(string input)
{
    using (var md5 = MD5.Create())
    {
        var inputBytes = Encoding.UTF8.GetBytes(input);

        var hashBytes = md5.ComputeHash(inputBytes);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes .Length; i++)
        {
            sb.Append(hashBytes [i].ToString("X2"));
        }
        return sb.ToString().ToLower();
    }
}

1 Ответ

0 голосов
/ 09 июля 2019

Как предложил @JeroenMostert в комментариях, кажется, что не-ascii символ £ теряется после git clone, поэтому это не имеет никакого отношения (как я надеялся) к коду C #, UTF-8 илихэш-функции.

Я задал отдельный вопрос по этому поводу здесь: Git портит символы не ascii в контейнере Linux

...