Как создать случайную строку байтов в C#?
Сабж.
Пытаюсь перевести код python в C#
Есть такой кусок кода
import base64
import hashlib
import secrets
random = base64.urlsafe_b64encode(secrets.token_bytes(32))
secrets.token_bytes(32) возвращает случайную строку байтов, содержащую количество байтов nbytes.
А base64.urlsafe_b64encode() принимает "байтоподобный объект".
Есть у меня такой C# код
public static byte[] GetByteArray()
{
Random rnd = new Random();
byte[] b = new byte[32];
rnd.NextBytes(b);
return b;
}
Но это массив байтов. окей.
Делаю BitConverter.ToString(key) получаю строку вида 75-A7-A0-85-D3-05-8E-....... Но она не такая как в документации питона
>>> token_bytes(16)
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
Что не так? Как мне получить такую же строку?
upd
Да, по коду питона мне дальше нужно
random = base64.urlsafe_b64encode(secrets.token_bytes(32))
m = hashlib.sha256()
m.update(random)
d = m.digest()
code_challenge = base64.urlsafe_b64encode(d).decode().replace("=", "")
Но это я уже знаю как дальше. Но мне нужна строка байтов.
Просто с массивом байтов я уже пробовал делать и у меня не получается.
upd2
Я незнаю почему мне нужна строка вида \xebr\xe2\xebP1\x8b это мне нужно для OAuth 2.0, есть пример на python я пытаюсь его полностью повторить.
Потому что когда на C# я генерирую массив байтов потом его в Base64 потом его в mySHA256 потом его в Base64 как в инструкции <URL safe Base64(SHA256(URL safe Base64(random 32 byte string)))> у меня ничего не работает
Ответы (1 шт):
Для криптографии можно использовать криптостойкий PRNG RandomNumberGenerator.
Получится как-то так, если я верно понял код
private static string ToUrlSafeBase64(byte[] bytes, bool trimPadding = false)
{
string result = Convert.ToBase64String(bytes)
.Replace('+', '-')
.Replace('/', '_');
return trimPadding ? result.TrimEnd('=') : result;
}
string base64key = ToUrlSafeBase64(RandomNumberGenerator.GetBytes(32));
byte[] bytes = Encoding.UTF8.GetBytes(base64key);
byte[] hash = SHA256.HashData(bytes);
string base64 = ToUrlSafeBase64(hash, true);
Console.WriteLine(base64);
Пример вывода в консоль
-XQ8VkSPUMFDW8m9d_xnzPYvFhrordTV-TUQConvVbE