当前位置: 首页 > 知识库问答 >
问题:

从 base 64 字符串转换时出错

赵越
2023-03-14

我正在尝试加密和解密存储在SQL中的密码。解码时,我收到一个错误。输入不是有效的Base-64字符串,因为它包含一个非Base-64字符、两个以上的填充字符或填充字符中的非法字符。位于System.Convert.FromBase64_Decode。

解密代码:

string userEmail = Email1.Text;
string userPass = passW.Text;
SqlConnection sqlcon = new SqlConnection("My connection")
string query = "Select * from users Where email= '" + userEmail + "'";
SqlDataAdapter sda = new SqlDataAdapter(query, sqlcon);
DataTable dtbl = new DataTable()
sda.Fill(dtbl);
if (dtbl.Rows.Count == 1)
{
    string savedPasswordHash = dtbl.Rows[0][1].ToString();
    savedPasswordHash.Replace("-", "");
    byte[] hashBytes = Convert.FromBase64String(savedPasswordHash);
    byte[] salt = new byte[16];
    Array.Copy(hashBytes, 0, salt, 0, 16);
    var pbkdf2 = new Rfc2898DeriveBytes(userPass, salt, 10000);
    byte[] hash = pbkdf2.GetBytes(20);
    int ok = 1;
    for (int i = 0; i < 20; i++)
        if (hashBytes[i + 16] != hash[i])
            ok = 0;
            if (ok == 1) //good creds & redirect

加密代码:

byte[] salt1;
new RNGCryptoServiceProvider().GetBytes(salt1 = new byte[16]);
var pbkdf21 = new Rfc2898DeriveBytes(EmailTextBox.Text, salt1, 10000); 

byte[] hash1 = pbkdf21.GetBytes(20);
byte[] hashBytes1 = new byte[36];

Array.Copy(salt1, 0, hashBytes1, 0, 16);
Array.Copy(hash1, 0, hashBytes1, 16, 20);

string savedPasswordHash1 = Convert.ToBase64String(hashBytes1);
string commString = $"UPDATE users SET NewPassword = ('{savedPasswordHash1}') where Email = ('{email2}')";
using (SqlConnection connect = new SqlConnection(constring))
{
    using (SqlCommand comm = new SqlCommand())
    {
        comm.Connection = connect;
        comm.CommandText = commString;
        connect.Open();
        comm.ExecuteNonQuery();
        connect.Close();
    } 

列的数据类型为nvarchar

共有1个答案

贝镜
2023-03-14

好的,问题出在SQL代码中。您不应该像这样在查询中添加值。这造成了SQL注入攻击的巨大风险,以及您面临的问题。

Bas64字符串可能包含不打算转到查询字符串的字符。

因此,请像这样更改加密:

string commString = "UPDATE users SET NewPassword = @PasswordHash where Email = @Email";
using (SqlConnection connect = new SqlConnection(constring))
{
    using (SqlCommand comm = new SqlCommand())
    {
        comm.Connection = connect;
        comm.CommandText = commString;
        comm.Parameters.AddWithValue("PasswordHash", savedPasswordHash1);
        comm.Parameters.AddWithValue("Email", email2);
        connect.Open();
        comm.ExecuteNonQuery();
        connect.Close();
    } 
}

此外,您可以简化命令创建,但我不想更改两件事。你可以稍后修复。

--编辑--

经过反复讨论,很明显问题出在解密而不是加密部分。你按照我上面说的去做,否则你的代码会有很大的危险。

string savedPasswordHash = dtbl.Rows[0][27].ToString(); //Change 1 to 27

同时删除下一行

//savedPasswordHash.Replace("-", ""); (Remove)
 类似资料:
  • 问题内容: 我需要将base64编码字符串转换为ArrayBuffer。base64字符串是用户输入的字符串,它们将通过电子邮件进行复制和粘贴,因此在加载页面时它们不存在。我想在javascript中做到这一点,如果可能的话,不向服务器进行ajax调用。 这看起来不错,但我不知道如何使用代码。 有没有简单的方法(也许是本地方法)进行转换?谢谢 问题答案: 尝试这个:

  • 问题内容: 我将 图片获取 为base64字符串( ) ,下面是将转换为图片的函数, 现在,如果图像为png,则png库将创建图像,而jpg库将引发错误,反之亦然。 问题是当我上传png时效果很好,但是当我 上传jpg文件时 返回此错误 无效的JPEG格式:缺少SOI标记 输入为: 这可能有帮助 问题答案: 您将您的传递给,这开始消耗阅读器,只是发现输入不是有效的PNG,因此返回错误。 然后,将部

  • 有一种方法可以将输入流转换为字符串,并将其编码为base64,对吗? 在我的函数中,我得到了InputStream参数,需要将其插入到Oracle数据库表的BLOB字段中。 有办法做到吗? (我的数据库对象包含用于保存图像的字符串字段,但我找不到任何方法将InputStream转换为base 64格式的字符串。)

  • Im能够将转换为base64。但现在我正在尝试将其转换回并存储在中 编辑%1;首先感谢大家,我已经尝试了以下所有的解决方案,它们都起作用了。但是我有多个图像,如果中没有图像怎么办?

  • 我需要将base64编码字符串转换为ArrayBuffer。base64字符串是用户输入,它们将从电子邮件中复制和粘贴,因此当页面加载时它们不在那里。如果可能的话,我希望在javascript中完成此操作,而不需要对服务器进行ajax调用。 我发现这些链接很有趣,但它们对我没有帮助:

  • 问题内容: 我一直在尝试使用 GZIPOutputStream 等,但在理解它们方面没有成功。我要做的就是将字符串- “字符串” 转换为GZIP Base64格式。我怎样才能做到这一点? 编辑: 通过GZIP Base64格式,我的意思是字符串首先使用GZIP压缩,然后转换为Base64 问题答案: 使用Apache Commons Codec 。 这是一个示例类: 哪个输出: 在Linux下,您