2

编辑:对不起,我忘了提及,我没有使用实现的 sha512 crypt,因为据我所知,它不涉及盐值或指定的轮数来计算散列。

好的,所以我正在用 c# 编写 sha-512 crypt 并按照此处找到的步骤进行操作...

http://people.redhat.com/drepper/SHA-crypt.txt

这是我第一次做任何与加密相关的事情,所以我想确保我正确理解了这些步骤......我对 c 代码的理解不够好,无法直接从 c 翻译到 c#:/

我假设完成摘要与计算哈希相同。在这种情况下,我还假设当这些步骤引用完成的摘要时,它们指的是计算的哈希,而不是预哈希计算的摘要字节。如果我错了请纠正我!

假设步骤 1-8 的一切都已正确完成,我的疑问从步骤 9 开始

9.对于密码字符串中的每个32或64字节的块(不包括C表示中的终止NUL),将摘要B添加到摘要A

由于我使用的是 SHA-512,因此我的块大小为 64 字节。

下面的代码会产生预期的结果吗?

//FYI, temp = digestA from steps 1-3 (before expanding digestA for step 9)
//alt_result = computed digestB hash (64 byte hash)

for (cnt = key.Length; cnt > 64; cnt -= 64)                         //9
{
    int i = 0;
    ctx.TransformBlock(alt_result, 0, 64, digestA, temp.Length + 64 * i);
    i++;
}

如果有人能澄清我所说的是正确的,我将不胜感激。谢谢!

4

2 回答 2

3

加盐就像在输入字符串的末尾附加一个固定的字节字符串一样简单。本质上为您的输入提供已知的“本土”转换。

关于算法本身:你似乎开始处于劣势。一个新手,你对基本的加密术语做出了很多“假设”,甚至需要澄清。如果 CLR 实现对您不起作用,我认为您最好花时间寻找一个好的 C 实现并弄清楚如何与之集成。找出对它的互操作(外部)调用将比深入加密的内部要容易得多,结果将更加有效,并且您获得的有关本机互操作的知识将更加有用/可重用。

于 2011-10-21T16:09:47.207 回答
3

我将为稍后可能遇到此问题的其他人添加一些重要的说明。

首先:SHA512 和 SHA512Crypt 是两种不同的算法,用于两种不同的目的。SHA512 是一种通用的散列算法(见此)。SHA512Crypt 是一种密码存储或基于密码的密钥派生算法,它在内部使用 SHA512(哈希)(请参阅此)。SHA512Crypt 基于早期使用 MD5 而不是 SHA512 的 Crypt 函数。

专门创建了密码存储/密钥生成算法,以使其暴力破解成本高出几个数量级。完成此操作的典型方法是以某种方式迭代底层哈希算法。但是,您自己不想这样做...这使我们...

第二: 不要编写自己的密码学方法。(见此)即使您确切地知道自己在做什么,也有很多方法可以搞砸。

如果您不想使用基于 SHA1 的内置 Rfc2898DeviceBytes,那么您可以查看bcrypt或其他一些公开的、经过审查的已知加密算法的实现。

于 2013-02-04T21:05:01.307 回答