Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Base-64字符数组或字符串的长度无效:C#_C#_Asp.net Web Api_Base64_Password Hash_Sha 3 - Fatal编程技术网

Base-64字符数组或字符串的长度无效:C#

Base-64字符数组或字符串的长度无效:C#,c#,asp.net-web-api,base64,password-hash,sha-3,C#,Asp.net Web Api,Base64,Password Hash,Sha 3,我是C#的新手,在我的web API项目中,我有一些使用SHA3散列用户密码的代码 在API中,我有两种方法 第一种方法用于新用户创建帐户时,我只是对密码进行哈希运算并将其存储在表中 第二种方法是,当同一用户再次登录时,我获取散列密码(字符串),并用它验证当前密码 在这里,我遇到了我在标题中提到的错误,我也参考了一些相关的帖子,但我无法解决这个问题 我已经验证了存储和获取的字符串具有相同的字符,并且生成和存储的字符串具有相同的字符 我不知道我在哪里犯的错误 Password : Abcd@12

我是C#的新手,在我的web API项目中,我有一些使用SHA3散列用户密码的代码

在API中,我有两种方法

第一种方法用于新用户创建帐户时,我只是对密码进行哈希运算并将其存储在表中

第二种方法是,当同一用户再次登录时,我获取散列密码(字符串),并用它验证当前密码

在这里,我遇到了我在标题中提到的错误,我也参考了一些相关的帖子,但我无法解决这个问题

我已经验证了存储和获取的字符串具有相同的字符,并且生成和存储的字符串具有相同的字符

我不知道我在哪里犯的错误

Password  : Abcd@123

 Hashed String : k/OMmdnW6FZ+zsOrE2rkdy8YEUH/rep5dlcRIwnG8Vc7kQ81VL8dEQv2Clyp7iRhb0HSfKtgOLBj5g/YbqHq7FKDj5epafNwasE=
调用确认方法

 bool isPasswordPassed = false;
                if (mHashedPassword != " " && mUserPassword != " ")
                {
                    isPasswordPassed = Hashing.Confirm(mUserPassword, mHashedPassword, Supported_HA.SHA512);
                }
byte[] hashBytes = Convert.FromBase64String(hashValue);
证实

public static bool Confirm(string plainText, string hashValue, Supported_HA hash)
        {
            byte[] hashBytes = Convert.FromBase64String(hashValue);//This line passing the error as in my title.
......
.......
.....
        }
但是当我像这样检查代码时,它工作得很好

check(mUserPassword){
    string a = Hashing.ComputeHash(mUserPassword, Supported_HA.SHA512, null);
    bool b = Hashing.Confirm(mUserPassword, a, Supported_HA.SHA512);
}
这里我传递密码以生成哈希和确认哈希,但它返回TRUE

谁能帮我解决这个问题


参考:

它可能是基于64 Unicode的编码转换。你应该通过编码

var plainTextBytes = System.Text.Encoding.Unicode.GetBytes(plainText);
string hashValue  = Convert.ToBase64String(plainTextBytes);
然后在确认方法中

 bool isPasswordPassed = false;
                if (mHashedPassword != " " && mUserPassword != " ")
                {
                    isPasswordPassed = Hashing.Confirm(mUserPassword, mHashedPassword, Supported_HA.SHA512);
                }
byte[] hashBytes = Convert.FromBase64String(hashValue);

应该有用。关于

有理由的向下投票在将来对我很有帮助FromBase64String(hashValue)失败,因此问题显然在于hashValue的值,它不是您显示的“Hashed String”值,因为它可以正常工作。@AlexK。实际上,我验证了hashValue,字符串char与存储在DB中的相同,我还使用存储的hash验证了创建的hash。在这方面你能帮我吗?你的示例哈希解码很好-
hashValue
不是那个字符串,请在调试器中检查它,看看它实际上是什么。调试器显示了我存储在DB中的相同值..真的弄乱了它@AlexK.Brother执行此转换后,它会更改实际值。@PabloDev