通过.net技术在Ruby中创建SHA1哈希

时间:2013-03-21 21:19:23

标签: ruby ruby-on-rails-3

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

如何通过Ruby执行以下操作?我正在创建哈希很好 - 但格式的东西让我感到困惑 - 好奇,如果Ruby标准库中存在某些东西。

System Security Cryptography (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); 
}

1 个答案:

答案 0 :(得分: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上的任何内容强制为'?',因此您可能需要使用.gsub或类似的方式在Ruby中模拟它,特别是如果您实际上期望它从数据源进来。