2013-03-21 36 views
0

好的,希望标题不会吓跑你。我使用Ruby创建sha1哈希,但它必须遵循我们的其他系统用来创建哈希的公式。通过.net技术在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); 
} 
+0

上面的代码是否要模拟C#?您能否引用它作为代码并为我们这些没有C#的人添加最终输出? – 2013-03-21 21:35:29

回答

2

特定的数据块的SHA1哈希是总是相同的散列(实际上只是一个大数字),唯一的变化应该是如何格式化它,例如发送到另一个系统。虽然特别模糊的系统可能会后处理数据,但可以截断它或仅使用替代字节等等。

从阅读C#代码的一个非常粗略的猜测,这结束了一个标准的40个字符的十六进制字符串。所以我最初的想法在Ruby中是:

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

。 。 。然而,我不知道C#中ascii格式对于ascii格式的强制要求是什么。拉丁语-1或UTF-8字符串。如果仅仅看到C#抛出异常,那么它们将是有用的示例输入 - 然后您知道是否需要担心Ruby版本的字符编码。输入到SHA1的数据是字节,而不是字符,所以使用哪种编码以及如何转换是您问题的一部分。

我目前的理解是,Encoding.ASCII.GetBytes会强制将字符127的任何内容强制为'?',所以您可能需要使用.gsub或类似的文件模拟Ruby,特别是如果您实际上期望来自数据源。

+0

感谢您的确认 - 我认为我做得很对 - 它的格式让我困惑了一下。我会继续并将此投票作为答案。 – 2013-03-22 01:36:00