oss上传文件 模拟http头请求数字签名验证失败
回 楼主小白程序员的帖子
我试了 去掉'/bucketdataupdate/2.jpg'后面的'\n'
dtime后面 加了\n的
运行还是同样的错误
我把生成的头贴出来:
PUT /2.jpg HTTP/1.1
Host:bucketdataupdate.oss-cn-beijing.aliyuncs.com
Content-Encoding:utf-8
Content-Disposition: attachment;filename=2.jpg
Date:Wed, 11 Nov 2015 05:50:29 GMT
Content-Type:image/jpg
Content-Length:176853
Authorization:OSS 我的idkey:FNpk4LN0ZMgxktXiDw+WTXxx2SI=
Authorization验证头:
PUT
0925f7b63fd62bbbc9db313676681658
image/jpg
Wed, 11 Nov 2015 05:50:29 GMT
/bucketdataupdate/2.jpg
-------------------------
回 1楼姜恒的帖子
还是不行 怎么办啊 你有qq吗加一个
-------------------------
回 2楼shinenuaa的帖子
这个并没有什么用啊
-------------------------
回 8楼姜恒的帖子
谢谢 指点 请求成功了 正确的Authorization
应该是
string mk = 'PUT\n' //VERB
+ '\n' //CONTENT-MD5如果不需要验证内容 也必须加'\n'
+ 'image/jpg\n' //CONTENT-TYPE
+ dtime + '\n' // DATE 服务器时间似乎不是北京时间 必须用当前时间减8个小时的时间 请求
+ '/bucketdataupdate/6.jpg'; //访问的OSS资源
但是又出一个问题 为什么我加上6.jpg的MD5 就验证不通过?是不是服务器端 求MD5的方式和我的不一样? 但是我求出来的md5绝对没有问题 因为我的系统右键属性可以看到文件的md5值 和我求出来的一样。为什么加上 就不行了呢?
string fileMD5 = GetMD5HashFromFile(file.FullName);
string mk = 'PUT\n'
+ fileMD5+'\n'
+ 'image/jpg\n'
+ dtime + '\n'
+ '/bucketdataupdate/6.jpg';
这样就不可以 不加md5 就对 why?
-------------------------
Reoss上传文件 模拟http头请求数字签名验证失败
谢谢大家问题终于全部解决了
研究了两天 现在分享出来 希望以后有人遇到这样的问题 可以很快的搞定
string fileMD5 = GetMD5HashFromFile(file.FullName);
string mk = 'PUT\n'
+ fileMD5+'\n'
+ 'image/jpg\n'
+ dtime + '\n'
+ '/bucketdataupdate/6.jpg';
HTTP的Content-MD5并不是单纯的文件的MD5 ,是遵循rfc1864标准(就是把md5的二进制转换成base64)。
所以上面的那个直接加fileMD5是错误的
由于http首部无法记录二进制值 所以必须通过base64处理
如果需要MD5验证 http头也需要加上Content-md5:值 这个字段
直接上源码:
const string accessId = '我的keyid';
const string accessKey = '我的keypass';
const string endpoint = 'http://oss-cn-beijing.aliyuncs.com';
const string bucketName = 'bucketdataupdate';
private void button1_Click(object sender, EventArgs e)
{
FileInfo file = new FileInfo(@'E:\Cshap_text\PublishUpdate\PublishUpdate\bin\Debug\2.jpg');
byte[] fileMD5 = GetMD5HashByteFromFile(file.FullName);//这个地方得到的是md5的byte形式 不要转成16进制字符串
string base64FileMd5 = Convert.ToBase64String(fileMD5);
//由于服务器时间比本地时间晚8个小时 所以要减去8
string dtime = DateTime.Now.AddHours(-8).ToString('r');
StringBuilder httpHeader = new StringBuilder();
httpHeader.Append('PUT /2.jpg HTTP/1.1\r\n');
httpHeader.Append('Host:bucketdataupdate.oss-cn-beijing.aliyuncs.com\r\n');
httpHeader.Append('Content-Md5:'+base64FileMd5 +'\r\n');
httpHeader.Append('Content-Encoding:utf-8\n');
httpHeader.Append('Content-Disposition: attachment;filename=2haha.jpg\r\n');
httpHeader.Append('Date:' + dtime + '\r\n');
httpHeader.Append('Content-Type:image/jpg\r\n');
httpHeader.Append('Content-Length:' + file.Length + '\r\n');
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = Encoding.UTF8.GetBytes('我的keyPass');
string mk = 'PUT\n'
//0925F7B63FD62BBBC9DB313676681658
+ base64FileMd5 + '\n'
+ 'image/jpg\n'
+ dtime + '\n'
+ '/bucketdataupdate/2.jpg';
byte[] dataBuffer = Encoding.UTF8.GetBytes(mk);
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
string base64 = Convert.ToBase64String(hashBytes);
httpHeader.Append('Authorization:OSS 我的keyid:' + base64 + '\r\n');
httpHeader.Append('\r\n');
byte[] header = Encoding.UTF8.GetBytes(httpHeader.ToString());
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect('bucketdataupdate.oss-cn-beijing.aliyuncs.com', 80);
client.Send(header);
FileStream fs = new FileStream(@'E:\Cshap_text\PublishUpdate\PublishUpdate\bin\Debug\2.jpg', FileMode.Open);
byte[] buffer = new byte[1024];
int redSize = 0;
while ((redSize = fs.Read(buffer, 0, buffer.Length)) > 0)
{
client.Send(buffer,0,redSize,SocketFlags.None);
}
fs.Close();
//client.SendFile(@'E:\Cshap_text\PublishUpdate\PublishUpdate\bin\Debug\2.jpg');
byte[] recbuffer = new byte[1024];
client.Receive(recbuffer);
string msg = Encoding.UTF8.GetString(recbuffer);
client.Close();
}
private static byte[] GetMD5HashByteFromFile(string fileName)
{
try
{
FileStream file = new FileStream(fileName, FileMode.Open);
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
return retVal;
}
catch (Exception ex)
{
throw new Exception('GetMD5HashFromFile() fail,error:' + ex.Message);
}
}
private static string GetMD5HashStringFromFile(string fileName)
{
try
{
FileStream file = new FileStream(fileName, FileMode.Open);
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i {
sb.Append(retVal
.ToString('x2')); } return sb.ToString(); } catch (Exception ex) { throw new Exception('GetMD5HashFromFile() fail,error:' + ex.Message); } } }
赞0
踩0