【问题标题】:Failed to convert string to byte[]无法将字符串转换为字节 []
【发布时间】:2021-07-13 22:18:42
【问题描述】:

我正在处理一个登录页面,该页面从文本字段中获取密码,然后单击按钮,将值与数据库进行比较,但是当我尝试使用 SqlDataReader 时,我收到了从字符串转换为字节的错误[] 失败。

byte[] pswBytes = Encoding.ASCII.GetBytes(psw);
var byte64 = Convert.ToBase64String(pswBytes);
using (SqlCommand cmd = new SqlCommand(sql, con))
{
    cmd.Parameters.Add("@email", SqlDbType.VarChar, 250).Value 
        = email;

    cmd.Parameters.Add("@psw", SqlDbType.VarBinary, byte64.Length).Value = byte64;

    con.Open();

    using (SqlDataReader reader = cmd.ExecuteReader())
    {}
}

数据库中的密码也是一个字节(64)。

错误是:

InvalidCastException:从“System.String”到“System.Byte[]”的无效转换。 System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)

InvalidCastException:无法将参数值从 String 转换为 Byte[]。 System.Data.SqlClient.SqlParameter.CoerceValue(object value, MetaType destinationType, out bool coercedToDataFeed, out bool typeChanged, bool allowStreaming)

【问题讨论】:

  • 如果出现错误,则会有一条错误消息提供更多信息。将其添加到您的问题中。
  • @PresidentJamesK.Polk 我包含了错误
  • Convert.ToBase64String 返回一个字符串。您的意思是使用pswBytes 而不是byte64
  • 与问题无关,但请注意,以这种方式存储密码被认为是不安全的。最好对密码进行哈希处理,这样就无法再发现原始密码。请参阅:cheatsheetseries.owasp.org/cheatsheets/…cheatsheetseries.owasp.org/cheatsheets/…
  • 感谢您分享这个@NickMuller!

标签: c# .net entity-framework


【解决方案1】:

为什么要将pswBytes 转换为string?当数据类型为二进制时,程序的输入数据类型必须是字节数组。

byte[] pswBytes = Encoding.ASCII.GetBytes(psw);
using (SqlCommand cmd = new SqlCommand(sql, con))
{
   cmd.Parameters.Add("@email", SqlDbType.VarChar, 250).Value = email;
   cmd.Parameters.Add("@psw", SqlDbType.VarBinary, pswBytes.Length).Value = pswBytes;

   con.Open();

   using (SqlDataReader reader = cmd.ExecuteReader())
   {}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多