0

好的,希望标题没有吓跑你。我正在使用 Ruby 创建一个 sha1 哈希,但它必须遵循我们其他系统用来创建哈希的公式。

如何通过 Ruby 执行以下操作?我很好地创建了哈希 - 但格式的东西让我感到困惑 - 好奇 Ruby 标准库中是否有等价的东西。

系统安全密码学 (MSDN)

这是我试图转换为 Ruby 的 C# 代码。我的哈希值很好,但不确定 'String.Format("{0,2:X2}' 部分。

//create our SHA1 provider
SHA1 sha = new SHA1CryptoServiceProvider();

String str = "Some value to hash";
String hashedValue; -- hashed value of the string

//hash the data -- use ascii encoding
byte[] hashedDataBytes = sha.ComputeHash(Encoding.ASCII.GetBytes(str));

//loop through each byte in the byte array 
foreach (byte b in hashedDataBytes) 
{
   //convert each byte -- append to result
   hashedValue += String.Format("{0,2:X2}", b); 
}
4

1 回答 1

2

特定数据的 SHA1 哈希始终是相同的哈希(实际上只是一个大数字),唯一的变化应该是您需要如何格式化它,例如发送到其他系统。尽管特别晦涩的系统可能会对数据进行后处理、截断或仅采用备用字节等。

根据阅读 C# 代码的一个非常粗略的猜测,这最终得到了一个标准的 40 个字符的十六进制字符串。所以我最初对 Ruby 的想法是:

require 'digest/sha1'
Digest::SHA1.hexdigest("Some value to hash").upcase

. . . 但是,我不知道当 C# 中的 ascii 格式以 Latin-1 或 UTF-8 字符串开头时会产生什么影响。如果只是为了看到 C# 抛出异常,它们将是有用的示例输入 - 你知道你是否需要担心你的 Ruby 版本的字符编码。输入到 SHA1 的数据是字节,而不是字符,因此使用哪种编码以及如何转换是您的问题的一部分。

我目前的理解是 Encoding.ASCII.GetBytes 将强制任何超过字符号 127 的内容为“?”,因此您可能需要在 Ruby 中使用 .gsub 或类似名称来模拟它,特别是如果您实际上期望它来自数据源。

于 2013-03-21T21:26:15.053 回答