将字符串转换为其小写 ascii 十六进制表示
Convert string to its lower case ascii hexadecimal representation
我正在为支付集成创建 sha-256 哈希
要求是(来自银行的说明):
第 1 步:创建字符串
例如 987654321012013:07:16-09:57:081.00826TopSecret
第 2 步:将创建的字符串转换为其 ascii 十六进制表示形式
例如 3938373635343332313031323031333a30373a31362d30393a35373a3038312e3030383236546f70536563726574
第 3 步:生成转换后的字符串的 sha-256 哈希
例如 3d7e75aa0b4e0e1d4a7ac87e451e64692cced46f4358ef35a69d96721341243c
问题:
我代码中的第 2 步给出大写字母 A、D、E、F 等,然后生成与给定示例不同的 sha-256。我需要生成具有小写十六进制表示的字节数组。
这是我的代码(在 .NET 4.5.2 中):
string hash = createHash( inputstring );
public static string createHash(string inputString)
{
SHA256 sha256 = SHA256Managed.Create();
byte[] bytes = Encoding.ASCII.GetBytes(inputString);
// need my bytes to be lower case
byte[] hash = sha256.ComputeHash(bytes);
return GetStringFromHash(hash).ToLower();
}
感谢您的帮助。
你已经哈希了:
987654321012013:07:16-09:57:081.00826TopSecret
不是它的 ascii 十六进制表示法
我怀疑你想更换
// need my bytes to be lower case
类似
var inputToHash = BitConverter.ToString(bytes).Replace("-","").ToLower();
或者类似
var inputToHash = string.Concat(bytes.Select(b => b.ToString("x2")));
然后散列inputToHash
(再次GetBytes),而不是bytes
如果您需要更高的性能,也许使用 stringbuilder 而不是 bitconverter 或 linq
缺少的步骤是转换为十六进制表示形式的字符串。我们可以将字符串的字符转换为 int
然后将其格式化为 .ToString("x2")
.
的十六进制
//Step 1: Create the string
string secret = "987654321012013:07:16-09:57:081.00826TopSecret";
//Step 2: Convert the created string to its ascii hexadecimal representation
string hexString = String.Concat(secret.Select(c => ((int)c).ToString("x2")));
// Has already lower case hex digits here. No action required.
//Step 3: generate sha-256 hash of the converted string
byte[] bytes = Encoding.ASCII.GetBytes(hexString);
SHA256 sha256 = SHA256Managed.Create();
byte[] hash = sha256.ComputeHash(bytes);
// Return the hash bytes as hexadecimal string
return GetStringFromHash(hash);
请注意,字符串是字符的枚举。即,String Class 实现了 IEnumerable<char>
。因此,我们可以使用LINQ Select
来转换输入字符串的字符。请注意,在 C# 中,char
类型被视为 16 位数字类型。因此,您可以将它转换为 int
(32 位)。
您可以这样实施 GetStringFromHash
:
private static string GetStringFromHash(byte[] hash)
{
return String.Concat(hash.Select(b => b.ToString("x2")));
}
请注意 .ToString("x2")
生成小写十六进制数字。因此,不再需要 .ToLower()
。
请注意,使用 ASCII 的要求将字符集限制在 (char)1 .. (char)127
范围内。 (char)0
被排除在外,因为它在某些 API 中可能被误解为字符串终止符。因此,不确定此限制是否涉及秘密输入字符串或十六进制字符串或两者。将秘密字符串限制在 (char)1 .. (char)255
范围内可能就足够了,这将包括一些变音符号,但肯定会排除汉字,例如
我正在为支付集成创建 sha-256 哈希 要求是(来自银行的说明):
第 1 步:创建字符串 例如 987654321012013:07:16-09:57:081.00826TopSecret
第 2 步:将创建的字符串转换为其 ascii 十六进制表示形式 例如 3938373635343332313031323031333a30373a31362d30393a35373a3038312e3030383236546f70536563726574
第 3 步:生成转换后的字符串的 sha-256 哈希 例如 3d7e75aa0b4e0e1d4a7ac87e451e64692cced46f4358ef35a69d96721341243c
问题: 我代码中的第 2 步给出大写字母 A、D、E、F 等,然后生成与给定示例不同的 sha-256。我需要生成具有小写十六进制表示的字节数组。
这是我的代码(在 .NET 4.5.2 中):
string hash = createHash( inputstring );
public static string createHash(string inputString)
{
SHA256 sha256 = SHA256Managed.Create();
byte[] bytes = Encoding.ASCII.GetBytes(inputString);
// need my bytes to be lower case
byte[] hash = sha256.ComputeHash(bytes);
return GetStringFromHash(hash).ToLower();
}
感谢您的帮助。
你已经哈希了:
987654321012013:07:16-09:57:081.00826TopSecret
不是它的 ascii 十六进制表示法
我怀疑你想更换
// need my bytes to be lower case
类似
var inputToHash = BitConverter.ToString(bytes).Replace("-","").ToLower();
或者类似
var inputToHash = string.Concat(bytes.Select(b => b.ToString("x2")));
然后散列inputToHash
(再次GetBytes),而不是bytes
如果您需要更高的性能,也许使用 stringbuilder 而不是 bitconverter 或 linq
缺少的步骤是转换为十六进制表示形式的字符串。我们可以将字符串的字符转换为 int
然后将其格式化为 .ToString("x2")
.
//Step 1: Create the string
string secret = "987654321012013:07:16-09:57:081.00826TopSecret";
//Step 2: Convert the created string to its ascii hexadecimal representation
string hexString = String.Concat(secret.Select(c => ((int)c).ToString("x2")));
// Has already lower case hex digits here. No action required.
//Step 3: generate sha-256 hash of the converted string
byte[] bytes = Encoding.ASCII.GetBytes(hexString);
SHA256 sha256 = SHA256Managed.Create();
byte[] hash = sha256.ComputeHash(bytes);
// Return the hash bytes as hexadecimal string
return GetStringFromHash(hash);
请注意,字符串是字符的枚举。即,String Class 实现了 IEnumerable<char>
。因此,我们可以使用LINQ Select
来转换输入字符串的字符。请注意,在 C# 中,char
类型被视为 16 位数字类型。因此,您可以将它转换为 int
(32 位)。
您可以这样实施 GetStringFromHash
:
private static string GetStringFromHash(byte[] hash)
{
return String.Concat(hash.Select(b => b.ToString("x2")));
}
请注意 .ToString("x2")
生成小写十六进制数字。因此,不再需要 .ToLower()
。
请注意,使用 ASCII 的要求将字符集限制在 (char)1 .. (char)127
范围内。 (char)0
被排除在外,因为它在某些 API 中可能被误解为字符串终止符。因此,不确定此限制是否涉及秘密输入字符串或十六进制字符串或两者。将秘密字符串限制在 (char)1 .. (char)255
范围内可能就足够了,这将包括一些变音符号,但肯定会排除汉字,例如