【问题标题】:Representing Salt value as String将 Salt 值表示为字符串
【发布时间】:2011-03-29 23:08:27
【问题描述】:

我正在使用 .NET 生成加密消息。作为此过程的一部分,我正在生成一个用于加密过程的盐值,并将其传输给加密消息的接收者,以便他们可以解密消息。我想将盐作为文本字符串传输,但是当我尝试将盐字节数组转换为字符串时,每个字节都用“破折号”分隔。例如..

45-A1-99-0C-C0-0C-C2-C2

这是生成盐的方法..

Public Shared Function GenerateSalt() As String
  Dim rng As New RNGCryptoServiceProvider()
  Dim buffer As Byte() = New Byte(7) {}

  rng.GetBytes(buffer)
  Return BitConverter.ToString(buffer)
End Function

我的问题是这样的。如何将盐表示为收件人可以在其解密过程中使用的字符串?

【问题讨论】:

  • 收件人需要什么格式才能在解密过程中使用它?
  • 我不能肯定地说,因为除了 AES 128 位之外,我不知道收件人将使用什么系统来解密。我想给他们一个盐值作为字符串。
  • 它们应该能够处理几乎任何标准字符串:BitConverter 的输出应该没问题,尽管BitConverter.ToString(buffer).Replace("-","").ToLower() 可能会更标准。
  • @LukeH - 如果我用空格替换破折号不会改变盐的值吗?当接收者将盐的字符串表示形式转换为字节数组时,它与我用于加密的输入不同。不过我可能是错的。

标签: .net encryption bytearray salt


【解决方案1】:

最简单的方法是使用Convert.ToBase64String 方法将字节数组转换为字符串,反之亦然使用Convert.FromBase64String,例如

var salt = new byte[] { 1, 2, 4, 8, 16, 32, 64, 128, 255 };
var s = Convert.ToBase64String(salt);
var b = Convert.FromBase64String(s);

在此示例中,s 变量保存值 AQIECBAgQID/b 保存字节数组 { 1, 2, 4, 8, 16, 32, 64, 128, 255 },因此没有丢失任何内容。

是的,s 字符串的长度和salt 数组的length 不同。这是因为这里使用了 BASE64(它有 64 个符号字母表,尽管 byte 可能包含 256 个不同的值)。

但是,如果您想将字节数组转换为十六进制字符串,反之亦然,您会发现这个问题很有帮助:How do you convert Byte Array to Hexadecimal String, and vice versa, in C#?

【讨论】:

  • 我尝试使用 Convert.ToBase64String 方法,但最终得到了一个包含 12 个字符的字符串。我期待八个,但我总是以“=”结尾。这是一个例子。使用BitConverter.ToString 产生“34-B4-5B-72-C5-A7-32-51”,但使用Convert.ToBase64String 产生“NLRbcsWnMlE="
  • 既然您可以使用 Encoding.Default.GetBytes() 从纯文本转换为字节,那么如何从字节数组转换回纯文本?
  • @webworm,在大多数情况下是的。但使用代表西欧 (Windows) 代码页的 Encoding.GetEncoding(1252) 会更安全。这是因为一些东亚代码页使用多字节/字符编码。
【解决方案2】:

也许System.Convert.ToBase64String 是一个可能的选择。 System.Convert.FromBase64String 将编码后的字符串转换回来。

【讨论】:

  • 这可能是我最好的选择。无论他们使用什么语言,都应该有办法从 Base64 字符串转换。我只需要通知收件人盐是用 Base64 编码的。
【解决方案3】:

This 可能会有所帮助:

public static string CreateRandomPassword(int PasswordLength)
{
  String _allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789";
  Byte[] randomBytes = new Byte[PasswordLength];
  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  rng.GetBytes(randomBytes);
  char[] chars = new char[PasswordLength];
  int allowedCharCount = _allowedChars.Length;

  for(int i = 0;i<PasswordLength;i++)
  {
    chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];
  }

  return new string(chars);
}

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多