夏普哈希-完整的哈希库

ron4fun

成员
已加入
2019年10月20日
留言内容
6
编程经验
10+
夏普哈希 是一个C#哈希库,它提供了一个流畅的接口来计算字符串,文件,流,字节数组和未类型化数据的哈希值和校验和,这里仅举几例。

它还支持 Incremental Hashing, 克隆 空文摘.

可用算法
----------------------------------------

散列
----------------------------------------
循环冗余校验
  • 从CRC3到CRC64的所有CRC变体
校验和
  • 阿德勒32

非加密哈希函数
----------------------------------------

32位哈希
  • 美联社
  • BKDR
  • 伯恩斯坦
  • 伯恩斯坦1
  • 得可
  • DJB
  • 精灵
  • FNV
  • FNV 1a
  • JS
  • 詹金斯3
  • 杂音2
  • MurmurHash3_x86_32
  • 一个时间
  • PJW
  • RS
  • 旋转中
  • SDBM
  • ShiftAndXor
  • 超级快
  • XX哈希

64位哈希
  • FNV 64
  • FNV1a64
  • 杂音2_64
  • SipHash2_4
  • XX哈希

128位哈希
  • MurmurHash3_x86_128
  • MurmurHash3_x64_128

加密哈希函数
----------------------------------------
  • MD2
  • MD4
  • MD5
  • SHA-0
  • SHA-1
  • SHA-2(224、256、384、512、512-224、512-256)
  • GOST 34.11-94
  • GOST R 34.11-2012(AKA Streebog)(256,512)
  • Grindahl (256, 512)
  • HAS160
  • RIPEMD(128、256、256、320)
  • 老虎(128,160,192(第3、4、5回合))
  • 老虎2(128,160,192(第3、4、5回合))
  • Snefru (128, 256)
  • 哈瓦尔(128,160,192,224,256(第3、4、5回合))
  • Panama
  • RadioGatun(RadioGatun32,RadioGatun64)
  • WhirlPool
  • Blake2B(160、256、384、512)
  • Blake2S(128、160、224、256)
  • SHA-3(224、256、384、512)
  • 凯卡克(224,256,288,384,512)

关键派生功能
----------------------------------------

密码哈希方案(基于密码的密钥派生功能)

----------------------------------------
  • PBKDF2
  • Argon2(2i,2d和2id变体)
  • 加密

苹果电脑
----------------------------------------
  • HMAC(所有受支持的哈希)
  • KMAC(KMAC128,KMAC256)

XOF(可扩展输出功能)
----------------------------------------
  • 摇一摇(摇一摇128,摇一摇256)
  • CShake(CShake-128,CShake-256)
  • Blake2X(Blake2XS,Blake2XB)
  • KMACXOF(KMAC128XOF,KMAC256XOF)


查看仓库:
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
Really? How are we supposed to trust this library for secure hash implementations if something as basic as toUpper() is incorrect?

Converters.toUpper():
C#:
        public unsafe static void toUpper(ref byte[] value)
        {
            if (value == null) return;

            for (int i = 0; i < value.Length; i++)
            {
                char c = (char)value[i];
                value[i] = (byte)char.ToLower(c);
            } // end for

        } // end function toUpper
 

ron4fun

成员
已加入
2019年10月20日
留言内容
6
编程经验
10+
Really? How are we supposed to trust this library for secure hash implementations if something as basic as toUpper() is incorrect?

Converters.toUpper():
C#:
        public unsafe static void toUpper(ref byte[] value)
        {
            if (value == null) return;

            for (int i = 0; i < value.Length; i++)
            {
                char c = (char)value[i];
                value[i] = (byte)char.ToLower(c);
            } // end for

        } // end function toUpper

首先,感谢您的回复。
关于您指定的错误,这是一个错字。  ðŸ™,
另外,您可以信任该库,因为对于所有受支持的哈希都有适当的测试向量。

问候。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
我要说的是,考虑到此方法的代码只是我从git日志中看到的几次提交到存储库中的其中之一,因此缺乏测试覆盖范围。
 

ron4fun

成员
已加入
2019年10月20日
留言内容
6
编程经验
10+
从来没有计划过要首先使用该代码。
在最新提交中已将其删除。
再一次,我确实需要您了解该项目是一个WIP,旨在适时成为顶级图书馆。
我赞赏这种建设性的批评,因为这将有助于我在开发代码库时改进代码库。  ðŸ™,
再次感谢您对代码库的见解,并抽出宝贵的时间来学习它。

问候。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您将该信息放入自述文件中,可能会有所帮助。现在,您的自述文件听起来好像已经可以投入生产了。

Also explaining where the original code came from, as well as the design philosophy/goals may help. I keep wondering why you are not using the .NET Framework's existing HashAlgorithm abstract class, or why your readme is saying that the interfaces fluent, but I'm not seeing an obvious way to chain the interface methods together.
 

ron4fun

成员
已加入
2019年10月20日
留言内容
6
编程经验
10+
至于为什么我不使用HashAlgorithm抽象类,不幸的是,它没有为我提供我希望在项目中拥有的灵活性。
将来,我可能会提供一个代理类,该类将允许用户调整Hash类以与HashAlgorithm类一起使用。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
从我阅读的各种代码中,您似乎已经移植了 HashLib4Pascal 到C#(以及其他项目中的C ++)。如果是这样,那么您必须遵守原始项目的许可协议。该原始项目的MIT许可证说明如下:
C#:
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
不太...我不是律师,但我不认为这是怎么回事"Exhibit B"适用于MPL 2.0。就个人而言,我认为在附件A中,由于您从事衍生作品的制作,因此需要确认原始版权所有者。我认为它应该属于附件A,因为MIT许可证与MPL兼容。附件B用于不兼容的物品。

我相信这就是这句话"您可以添加版权拥有权的其他准确通知。"在“展览品A”中,-您可以添加原始作者的版权,也可以添加您自己的版权,因为您正在创建派生作品。

我建议向MPL人士询问合并MIT许可代码的最佳方法是什么。他们可能会拥有适当的法律专业知识来为您提供帮助。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
执照是由法律专业人士撰写的,并且通常会在文字上发挥作用,通常在语法上谨慎地撰写文字并命令您和我用一种英语阅读方式时,至少能使公众理解到最低限度,对于律师协会或法律界的任何人,它说的话都完全不同。让我给你一个模糊的概念;

如果法律文件规定您必须 理解 您特此同意并遵守合同。这个单词 理解 可能意味着你必须 站在下面 合约。在法律上,这意味着您将在您从合同或条款获得产品或服务的原则时间内放弃许可,以受该合同的条款和条件的约束。实际上,我的一些朋友经营着一个法律援助小组,许多年前使我对这些事情有了广泛的了解。因此,您需要非常小心,不要侵犯任何当前的许可条款和条件。

这些许可证有许多措词,经常用词来故意将其读为英语(常常令人困惑),但完全有不同的法律定义,而且看起来总是直截了当,但事实并非如此。我给您的建议不是在论坛上,尤其是在编程论坛上寻求法律建议,而要寻求您自己的法律援助的帮助,并征求他们的意见,以获取您需要获得的任何合同许可,使用,编辑,重新开发,重新分发最初不是您最初使用的产品。最后,您自己的许可证不涵盖您或任何合法使用您的产品的人,也没有合法地相对于您选择在获得其工作时选择忽略的另一个许可证承担任何责任。除非您遵守所有涉及的许可证,否则您就侵犯了版权,并可能侵犯了版权等。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
不客气。但是,我希望您通过寻求专业的法律建议来做到这一点,并且不要为了您自己。
 

德马克点

成员
已加入
2016年1月20日
留言内容
9
编程经验
Beginner
你好,

这是一个伟大的项目;谢谢你。但是,我一直在研究PBKDF2,想知道您是否有用于"IsValidPassword"功能?并没有真正注意到任何用于验证密码的示例代码。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
??看来您只是在复制和粘贴一些代码,而不是花时间去了解PBKDF2的功能。检查密码是否有效仅是检查从候选密码计算出的派生密钥是否与输入真实密码时计算出的派生密钥相匹配的问题。所以在伪代码中:

在用户注册或更改密码时间期间:
C#:
derivedKey = PBKDF2(..., newPassword, ...);
store derivedKey in database

用户登录期间:
在用户注册或更改密码时间期间:
C#:
derivedKey = PBKDF2(..., password, ...);
search database for matching user and derived key
if no match then password is invalid
 

德马克点

成员
已加入
2016年1月20日
留言内容
9
编程经验
Beginner
问候,并感谢您的答复。但是,我认为您的说法有些冒昧。我实际上是在试图了解PBKDF2的工作原理。对我来说,这只是一个自学项目。

However, I was also trying to see if there was a way using Array.Copy to get the salt from the hash similar to the way "h**ps://dev.to/demg_dev/pbkdf2-hash-a-secure-password-5f8l" does it. What is done is these salt is included in the hash and it is retrieved from that same hash. This way, you don't have to store the hash and the salt because both would be included in the one hash.

无论如何,我确实创建了一个功能验证检查器,但这并不是我想要的。我在弄清楚如何获取Array.Copy时遇到了一些困难,以使用我的代码正确处理哈希中的盐。

C#:
        public bool IsValid(string testPassword, string origHash)
        {
            var TestPassword2 = Encoding.ASCII.GetBytes(testPassword);
            var origSalt = Encoding.ASCII.GetBytes("7E2E837180B587ECC26795CFE0B7C4600B03F816"); // Test Salt
            // Generate hash from test password and original test salt and iteration 2048.
            // Compute the hash on the password the user entered.
            IHash hash1 = HashHotel.Crypto.CreateSHA1();
            IPBKDF2_HMAC pbkdf2 = HashHotel.KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC(hash1, TestPassword2, origSalt, 2048);
            byte[] Key = pbkdf2.GetBytes(24);
            pbkdf2.Clear();
            // Check Original hash against newly created hash using the test salt.
            // Convert to Hex and if hash values match then return true.
            var chString = Converters.ConvertBytesToHexString(Key, false);
            if (chString == origHash)
            {
                return true;
            }
            else
            {
                // Nothing matches; return false.
                return false;
            }
        }
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
复制原始盐是一个与使用PBKDF2的问题正交的问题。对于使用盐的任何其他密码加密算法,您也会遇到相同的问题。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
请注意,在 关联 您提供的内容,作者创建了一个40字节的数组。前20个字节包含salt,后20个字节包含派生密钥。然后,他存储了这40个字节,以供以后检查。当需要检查用户密码时,他使用40个字节中的前20个字节来使用相同的字符。然后,他将密码尝试传递到算法中,以获取新的派生密钥。如果新的派生密钥与40字节数组的最后20个字节匹配,则用户输入了正确的密码。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
I think that part of the issue is that Encoding.ASCII.GetBytes() may not be returning what you were expecting to get back:
C#:
var origSalt = Encoding.ASCII.GetBytes("7E2E837180B587ECC26795CFE0B7C4600B03F816"); // Test Salt
将返回以下字节:
C#:
37 45 32 45 38 33 37 31 38 30 42 35 38 37 45 43 43 32 36 37 39 35 43 46 45 30 42 37 43 34 36 30 30 42 30 33 46 38 31 36

您是否期望它返回:
C#:
7E 2E 83 71 80 B5 87 EC C2 67 95 CF E0 B7 C4 60 0B 03 F8 16
反而?

Or is the real problem here that origHash contains just the derived key and not both the derived key and the salt used to generate the derived key?
 

德马克点

成员
已加入
2016年1月20日
留言内容
9
编程经验
Beginner
不,预期的哈希结果:651187022238DCB4D290E37D5D76681E6C3932D703E1C1E6。

为此,我的测试密码是"password" and the test salt "7E2E837180B587ECC26795CFE0B7C4600B03F816"; IHash SHA1,迭代2048和PBKDF2.GetBytes(24);字节转换为十六进制字符串。

问题……在您的回复中"然后,他存储了这40个字节,以供以后检查。当需要检查用户密码时,他使用40个字节中的前20个字节来使用相同的字符。"他将这些字节保存在同一哈希中,对吗?那么,我在想什么可以使用SharpHash做到这一点?

我知道您可以使用以下方法将盐和哈希值保存为同一哈希值的一部分:":"添加以将它们分开,然后按":"。但是我认为他这样做的方式使盐的储存和取回变得更加容易。
 
最佳 底部