Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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
通过C#、Python和T-SQL的字节数组_C#_Python_Tsql_Hash - Fatal编程技术网

通过C#、Python和T-SQL的字节数组

通过C#、Python和T-SQL的字节数组,c#,python,tsql,hash,C#,Python,Tsql,Hash,主要问题: 我需要将python字节数组转换为T-SQL字节数组,有什么方法可以这样做吗 说明: 我想做到这一点: 脚本(Python)使用字符串将Http Get发送到服务器 服务器API(C#)将字符串的哈希值作为字节[]返回 字符串的散列通过人工复制粘贴到数据库查询(T-SQL)中 服务器上的哈希由SHA256算法(UTF-8编码)生成,然后复制到字节数组中并返回。 Python使用urllib.request获取哈希,并将其返回给最终用户,最终用户将其复制到查询中。 我已经得到了散列和从

主要问题:

我需要将python字节数组转换为T-SQL字节数组,有什么方法可以这样做吗

说明:

我想做到这一点:

  • 脚本(Python)使用字符串将Http Get发送到服务器
  • 服务器API(C#)将字符串的哈希值作为字节[]返回
  • 字符串的散列通过人工复制粘贴到数据库查询(T-SQL)中
  • 服务器上的哈希由SHA256算法(UTF-8编码)生成,然后复制到字节数组中并返回。 Python使用urllib.request获取哈希,并将其返回给最终用户,最终用户将其复制到查询中。 我已经得到了散列和从服务器获取散列的算法(在末尾发布)

    示例:

    从脚本中,我将“password”作为要散列的字符串发送,服务器端散列如下所示:

    94 136 72 152 218 40 4 113 81 208 229 111 141 198 41 39 115 96 61 13 106 171 189 214 42 17 239 114 29 21 66 216

    在python中,我的输出是

    “Xohimnoobhbfr0ovvjcypj3ngpqq73wkhvch0vqtg=”

    但是,如果我们将字节数组从服务器直接放到T-SQL中,它看起来是这样的:

    0x5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8

    代码片段:

    请忽略可能的例外情况,这些都是简化的方法

    散列方法(C#)

    散列返回方法(C#)

    Python脚本

    import urllib
    import urllib.request
    api = "http://localhost:12302/api/" 
    password = input("Put password\t") 
    url = api+"/Utils/Hash?toHash=%s" % password
    url = urllib.request.Request(url)
    responseData = urllib.request.urlopen(url)
    print(responseData.read())
    
    编辑

    Human的查询将是:

    insert into table(user_password) 
    values(HERECOMESPASSWORD)
    

    因此,复制粘贴“XOHIMNOBHFR0OVVJCYPJ3GPQ1QQ73WKHVCH0VQTG=”复制到此处不会有这样的效果。

    Python的结果是字节数组的Base64编码表示。我知道这一点是因为,首先,在你有了一些经验之后,你很容易识别它。第二,因为HTTP是一种文本协议,所以您发送的任何数据都必须以某种方式进行文本编码

    因此,必须获取该值并将其转换回C#中的字节数组。然后可以将它重新编码为十六进制的SQL

    但是我想提醒您不要使用
    SqlCommand
    SqlParameters
    。如果用户粘贴了密码之类的东西会怎么样

    ); UPDATE [table] SET [user_password] = '..whatever..'
    

    您可能会有sql注入漏洞。

    python结果是base64编码的,sql示例是十六进制的,这是sql在查询时的显示方式,但这只是字段中二进制数据的表示形式。这两个值可能是等价的,我没有检查,但您可能根本没有问题。好的,您必须对返回字节数组进行bas64解码,并执行以下两项操作之一:将其转换回十六进制格式的字符串(pain),或者更好,在SqlCommand中添加一个binary类型的SqlParameter,并将字节数组直接赋给它的值。@Crowcoder非常感谢,我误解了你的第一个评论。你是100%正确的,从base64到hex的转换是enoguh。请将您的评论作为答案发布,以便我可以将其标记为这样。你怎么知道这个结果是base64?
    insert into table(user_password) 
    values(HERECOMESPASSWORD)
    
    ); UPDATE [table] SET [user_password] = '..whatever..'