Sharphash - 完全散列库

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
是的我同意。当你能够被强烈打字时,为什么要打字?因此,在链接的情况下,将字节存储为字节,在单个阵列中,在我看来更好。它还增加了额外的防御层。让说福彩12选5走势图坏人的手段获取数据库的副本,但不是代码。他必须确定完整的40字节是否是散列密码,或者如果它的字节为1-n是散列,n-40是盐,反之亦然,反之亦然n 2到39.或者Link作者更为狡猾,他也可以互相交错哈希和盐节,以使事情更加困难。
 

DemarcPoint.

成员
加入
2016年1月20日
消息
9
编程经验
Beginner
谢谢回复。因为这是我第一次尝试理解PBKDF2。看起来我会根据我见过的一些例子回答我自己的问题并拼凑在一起。但是,我总是对一些建议开放。例如,如果迭代包含在生成的哈希中"|" or ":"这样它就可以在密码验证时分开,甚至可以在验证时使用。

提供的代码是实现更小的。我创建过载,其中福彩12选5走势图过载允许自定义散列算法,盐和迭代。

C#:
        private static Int32 Salt256bit { get; } = 256 / 8; // 256 bits = 32 Bytes

        public static string GetHashPBKDF2Password(string password)
        {
            // Notes:
            // Create a 32-byte secure salt and the same size of the key. This 32-byte produces 256 bits key output.
            // Add the same 32-byte size to the pbkdf2.GetBytes.
            // KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC hashes these values using the crypto SHA presented.
            // Double the hashBytes bytes then add the salt and pbkdf2.GetBytes value.
            // Copy each of the 32-bytes to the hashBytes bytes from the hashed salt and hashed value.
            //
            byte[] Password = Encoding.ASCII.GetBytes(password);
            string hashPass = string.Empty;

            // Create the salt value with a cryptographic PRNG
            byte[] salt;
            new RNGCryptoServiceProvider().GetBytes(salt = new byte[ByteSize]); // 32 Bytes = 256 bits.

            // Create the KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC and get the hash value using the SHA presented.
            // // I know SHA1 is not that secure at all anymore. Just using it to test with. :-)
            ihash sha = hashfactory.crypto.createSha1();
            IPBKDF2_HMAC pbkdf2 = HashFactory.KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC(sha, Password, salt, Pbkdf2Iterations);
            byte[] hash = pbkdf2.GetBytes(ByteSize); // 32 Bytes = 256 bits.

            // Double the size of the byte array to include the "pbkdf2.GetBytes" and salt.
            var ByteNumber = salt.Length;
            if (ByteNumber > 3)
            {
                hashBytes = new byte[ByteNumber * 2];
            }

            // Combine the salt and password bytes.
            Array.Copy(salt, 0, hashBytes, 0, ByteSize);
            Array.Copy(hash, 0, hashBytes, ByteSize, ByteSize);

            // Turn the combined salt+hash into a string for storage
            hashPass = Convert.ToBase64String(hashBytes);

            return hashPass;
        }

        public static bool ValidatePBKDF2Password(string password, string hashPass)
        {
            try
            {
                byte[] Password = Encoding.ASCII.GetBytes(password);
                bool result = true;

                // Extract the bytes
                byte[] hashBytes = Convert.FromBase64String(hashPass);
                // Get the salt
                byte[] salt = new byte[32];
                Array.Copy(hashBytes, 0, salt, 0, 32);
                // Compute the hash on the password that user entered.
                // I know SHA1 is not that secure at all anymore. Just using it to test with. :-)
                IHash hash1 = HashFactory.Crypto.CreateSHA1();
                IPBKDF2_HMAC pbkdf2 = HashFactory.KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC(hash1, Password, salt, Pbkdf2Iterations);
                byte[] hash = pbkdf2.GetBytes(32);
                // compare the results
                for (int i = 0; i < 32; i++)
                {
                    if (hashBytes[i + 32] != hash[i])
                    {
                        result = false;
                    }
                }
                return result;
            }
            catch (Exception)
            {
                return false;
            }
        }
       
        How to use:     string GeneratedHash = PBKDF2Helper.GetHashPBKDF2Password("password");
        Results: hv6t8N4rrVSKYFm80cCoVUEiUk2o11xLBc6lJb5kBXKTcwcKwl9dZwSdce01X0bi8BBhJY/QGGnNVAcR7ZhSvQ==
       
        Verify Password:  Boolean tester = PBKDF2Helper.ValidatePBKDF2Password("password", GeneratedHash);
                        txtVerificationResults.Text = tester.ToString();



希望这可以帮助沿途的人。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
什么 happens to your validate meeting when ByteSize is not 32?

什么 your generator when ByteSize is 3 or less?
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
当用户使用非ASCII字符以获取密码时会发生什么?
 

DemarcPoint.

成员
加入
2016年1月20日
消息
9
编程经验
Beginner
谢谢您的意见。对于此功能,没有设置要调整字节大小;它永远是32.现在,我创建了福彩12选5走势图过载,其中福彩12选5走势图人能够更改字节大小和更改需要更改字节大小的所有区域。对于非ASCII字符,我测试了希伯来语(פשדד'םרג)和希腊语(πασόνορδ),不同的哈希算法,如SHA3-SHA384,并且当我删除福彩12选5走势图字符时,验证返回为TRUE和FALSE。

SHA3​​-SHA384.
Usersalt160bit.
迭代= 10000.

希伯来结果:Xcoy0qegp7tfpppjagmjcxjikywbo / qm96faqtllz4xrbhe8tqtdcw ==
希腊结果:E / 7JXC5UHV7FU1GCI0HKCKGJ4TRWIUWEJWHJATJN8MMZYE3PZHW ==

至于字节尺寸小于三个。我认为这只是我令人困惑的位和字节。它应该是零,因为福彩12选5走势图字节是八位,这是正确的格式。请记住,这是我的第一次尝试。 :)

在我的设计思考帽。该想法是将验证方法与哈希密码生成方法匹配。它真的不是创建福彩12选5走势图符合一切的验证方法;虽然这可以完成。我认为这是卖方应该尝试实现感觉的东西,我最终只是试图了解C#中PBKDF2的动态。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
The problem is that with non-ASCII characters is that you are losing data when because of your use of Encoding.ASCII.GetBytes(). Notice the output of the following code:
C#:
using System;
using System.Linq;
using System.Text;

namespace ConsoleTest
{
    class Program
    {
        static void PrintCharsAndBytes(string text)
        {
            Console.WriteLine(text);
            foreach (var ch in text)
                Console.Write($"{(int)ch:x} ");
            Console.WriteLine();

            var bytes = Encoding.ASCII.GetBytes(text);
            foreach (var b in bytes)
                Console.Write($"{(int)b:x} ");
            Console.WriteLine();
        }

        static void Main()
        {
            PrintCharsAndBytes("פשדד'םרג");
            PrintCharsAndBytes("????'???");
        }
    }
}

输出:
C#:
????'???
5e4 5e9 5d3 5d3 27 5dd 5e8 5d2
3f 3f 3f 3f 27 3f 3f 3f
????'???
3f 3f 3f 3f 27 3f 3f 3f
3f 3f 3f 3f 27 3f 3f 3f
注意每个希伯来语Unicode字符刚刚映射到ASCII问号(0x3F)。那么这意味着即使用户输入密码"פשדד'םרג",黑客可以输入"????'???"并进入,因为您的哈希计算和验证将匹配。

I suggest using encoding.unicode.getBytes.() because C# using Unicode strings internally.
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
对于此功能,没有设置要调整字节大小;它永远是32.现在,我创建了福彩12选5走势图过载,其中福彩12选5走势图人能够更改字节大小和更改需要更改字节大小的所有区域。
以及你需要改变多个地方的原因是因为你的使用 魔术数字 in ValidatePBKDF2Password() but correctly use constant identifiers in GetHashPBKDF2Password(). If you used the ByteSize in ValidatePBKDF2Password(), then all you would need to do is a one line change for the initialization of ByteSize and you are done. Avoid using magic numbers.
 

DemarcPoint.

成员
加入
2016年1月20日
消息
9
编程经验
Beginner
我明白了......看起来像"转换器.ConvertStringTobytes."并encoding.unicode.getBytes具有相同的输出,能够处理非ASCII字符。我注意到了"encoding.utf8.getBytes."还能够处理非ASCII字符,但具有不同的输出。好抓,谢谢。我会改变它"encoding.unicode.getBytes.".

现在要回答你的其他帖子。魔术数字不在思考帽中。但我喜欢初始化福彩12选5走势图名副其实的想法,我已经完成了。实际上看起来有两个名副其实的初始化;盐和迭代。

从那时起我看到的唯一问题是如何使哈希选择。例子:"ihash sha = hashfactory.crypto.createSha1()" or "hashfactory.crypto.createSha3_256()" etc.
 

DemarcPoint.

成员
加入
2016年1月20日
消息
9
编程经验
Beginner
好的,我正在接受你的建议并改变了几件事。现在,我只是使用哈希密码方法和任何散列算法的验证。我初始化(Bytesize,Shahashalgorithm和PBKDF2韵)。其中每个都有福彩12选5走势图默认设置,以防用户没有初始化它们。

但是,虽然我能够设置SHA算法。这不是我这样做的有效方式。在游戏的这个阶段,我有点难以弄清楚一种更有效的方法来处理算法选择。

例如,我创建了许多静态(IHASH)实例,用户可以分配给(Ihash Shahashalgorithm)变量。但是,这不是最有效的方法。
C#:
 class
     //EXAMPLE:
     // For user use. Bwlow variables are to be used in the manual functions.
     public static Int32 UserSalt256bit { get; } = 256 / 8; // 256 bits = 32 Bytes

        //=====================================================================
        //                   IHash SHA algorithm
        //======================================================================
        public static IHash SHA2_SHA1ForPBKDF2() // Need a more efficient way to assign the SHA algorithm.
        {
            // SHA2-SHA1
            var x = HashFactory.Crypto.CreateSHA1();
            return x;
        }

        //=====================================================================
        //                   Assignments with Default
        //======================================================================

        public static Int32 ByteSize { get; set; } = Salt256bit; // Default
        public static IHash SHAhashAlgorithm { get; set; } = SHA3_SHA256ForPBKDF2(); // Default
        public static UInt32 Pbkdf2Iterations { get; set; } = 50000; // Default

        public static string GetHashPBKDF2Password(string password)
        {
            // Notes:
            // Create a 32-byte secure salt and the same size of the key. This 32-byte produces 256 bits key output.
            // Add the same 32-byte size to the pbkdf2.GetBytes.
            // KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC hashes these values using the crypto SHA presented.
            // Double the hashBytes bytes then add the salt and pbkdf2.GetBytes value.
            // Copy each of the 32-bytes to the hashBytes bytes from the hashed salt and hashed value.
            //
            byte[] Password = encoding.unicode.getBytes.(password);
            string hashPass = string.Empty;

            // Create the salt value with a cryptographic PRNG
            byte[] salt;
            new RNGCryptoServiceProvider().GetBytes(salt = new byte[ByteSize]);

            // Create the KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC and get the hash value using the SHA presented.
            IPBKDF2_HMAC pbkdf2 = HashHotel.KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC(SHAhashAlgorithm, Password, salt, Pbkdf2Iterations);
            byte[] hash = pbkdf2.GetBytes(ByteSize);

            // Double the size of the byte array to include the "pbkdf2.GetBytes" and salt.
            Int32 g = hash.Length + salt.Length;
            byte[] hashBytes = new byte[g];

            // Combine the salt and password bytes for later use.
            Array.Copy(salt, 0, hashBytes, 0, ByteSize);
            Array.Copy(hash, 0, hashBytes, ByteSize, ByteSize);

            // Turn the combined salt+hash into a string for storage
            hashPass = Convert.ToBase64String(hashBytes);

            return hashPass;
        }

        public static bool ValidatePBKDF2Password(string password, string hashPass)
        {
            try
            {
                byte[] Password = encoding.unicode.getBytes.(password);
                bool result = true;

                // Extract the bytes
                byte[] hashBytes = Convert.FromBase64String(hashPass);
                // Get the salt
                // Half the salt bytes of the salt in the GetHashPBKDF2PasswordTest method.
                byte[] salt = new byte[ByteSize];
                Array.Copy(hashBytes, 0, salt, 0, ByteSize);
                // Compute the hash on the password the user entered
                IPBKDF2_HMAC pbkdf2 = HashHotel.KDF.PBKDF2_HMAC.CreatePBKDF2_HMAC(SHAhashAlgorithm, Password, salt, Pbkdf2Iterations);
                byte[] hash = pbkdf2.GetBytes(ByteSize);
                // compare the results
                for (int i = 0; i < ByteSize; i++)
                {
                    if (hashBytes[i + ByteSize] != hash[i])
                    {
                        result = false;
                    }
                }
                return result;
            }
            catch (Exception)
            {
                return false;
            }
        }

//===========================================================
            // Set custom variables:
            // PBKDF2Helper.SHAhashAlgorithm = PBKDF2Helper.SHA2_SHA1ForPBKDF2(); // Setting the SHA algorithm.
            // PBKDF2Helper.Pbkdf2Iterations = 10000; // Setting the Iteration.
            // PBKDF2Helper.ByteSize = PBKDF2Helper.UserSalt128bit; // Setting the salt value.

            // Test Password Hash.
            //txtMessageResults.Text = "";
            //txtMessageResults.Text = PBKDF2Helper.GetHashPBKDF2Password("password");
            //
            //Boolean x = PBKDF2Helper.ValidatePBKDF2Password("password", "BLAH, BLAH");
            //txtVerificationResults.Text = x.ToString();
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
我建议你调查"dependency injection".
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
至于字节尺寸小于三个。我认为这只是我令人困惑的位和字节。它应该是零,因为福彩12选5走势图字节是八位,这是正确的格式。
我指的是这个代码:
C#:
// Double the size of the byte array to include the "pbkdf2.GetBytes" and salt.
var ByteNumber = salt.Length;
if (ByteNumber > 3)
{
    hashBytes = new byte[ByteNumber * 2];
}
what is hashBytes set to when ByteNumber <= 3. The reason why I was asking about ByteSize is because of this code: salt = new byte[ByteSize]
您可以在那里改变该代码简单:
C#:
// Double the size of the byte array to include the "pbkdf2.GetBytes" and salt.
if (ByteSize > 3)
{
    hashBytes = new byte[ByteSize * 2];
}

无论如何,它看起来你在帖子#29中解决了新代码中的问题:
C#:
// Double the size of the byte array to include the "pbkdf2.GetBytes" and salt.
Int32 g = hash.Length + salt.Length;
byte[] hashBytes = new byte[g];
 

DemarcPoint.

成员
加入
2016年1月20日
消息
9
编程经验
Beginner
是的,改变了代码,它看起来更好地工作。现在,随着依赖注入,我认为这将是对我的争斗,没有冬天的例子从并参加。我一直在看几个YouTube,并看过依赖注射的一些论文,看起来很有希望,但目前我不确定如何获得所有哈希算法"SHA2_SHA1ForPBKDF2()"在界面中,使其可以使用或参考。实际上,我只是使用SHA2和SHA3。

所以,现在我会询问您是否有一些示例或可以使用接口(依赖项注入)提供代码示例以使我启动。这将是最有帮助的。谢谢。
 
最佳 底部