创建上传图像的md5哈希
本文关键字:md5 哈希 图像 创建 | 更新日期: 2023-09-27 18:19:49
我正试图从用户在我的web应用程序上传的图像的字节数组中创建一个md5字符串。。这是因为我希望图像分布在不同的文件夹中。而且我不必使用userID作为文件夹名称。看起来更专业。
结果会是:
/images/ 'first-two-char-of-md5' / 'the-complete-md5-string'.[jpg,png,bmp....]
这听起来是处理图像的好解决方案吗?
所以。我的代码(来自互联网的东西。):
protected void btnUpload_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
if (CheckFileType(FileUpload1.FileName))
{
const int BUFFER_SIZE = 255;
Byte[] Buffer = new Byte[BUFFER_SIZE];
Stream theStream = FileUpload1.PostedFile.InputStream;
nBytesRead = theStream.Read(Buffer, 0, BUFFER_SIZE);
System.Text.ASCIIEncoding ASCIIEncoding = new ASCIIEncoding();
System.Text.UTF8Encoding utf8 = new UTF8Encoding();
//Just trying some stuff to see the output...
Label1.Text = ASCIIEncoding.GetString(CalculateMD5(theStream)) + "<br>" + utf8.GetString(CalculateMD5(theStream)) + "<br>" + Convert.ToBase64String(CalculateMD5(theStream));
}
}
}
private static byte[] _emptyBuffer = new byte[0];
public static byte[] CalculateMD5(Stream stream)
{
return CalculateMD5(stream, 64 * 1024);
}
public static byte[] CalculateMD5(Stream stream, int bufferSize)
{
MD5 md5Hasher = MD5.Create();
byte[] buffer = new byte[bufferSize];
int readBytes;
while ((readBytes = stream.Read(buffer, 0, bufferSize)) > 0)
{
md5Hasher.TransformBlock(buffer, 0, readBytes, buffer, 0);
}
md5Hasher.TransformFinalBlock(_emptyBuffer, 0, 0);
return md5Hasher.Hash;
}
结果。我从"calculateMD5()"中得到了一些输出,但当我试图将其放入标签1时。看看发生了什么。那里只有一堆邪恶的角色。我在这里做错了什么?我希望它是安全的。。。仅a-z、a-z、0-9。
散列作为字节数组返回。您需要将其转换为人类可读的形式,例如73868cb1848a216984dca1b6b0ee37bc
。您可以使用以下内容:
var s = new StringBuilder();
foreach (byte b in md5Hasher.Hash)
s.Append(b.ToString("x2").ToLower());
return s.ToString();
这将遍历哈希操作返回的字节列表,并将每个字节转换为十六进制。您可以在MSDN上找到有关可用于byte
类型的格式字符串的更多信息。
回答问题的第一部分:
这听起来是处理图像的好解决方案吗?
这应该是足够的,尽管如果两个用户上传相同的图像,那么它将导致相同的哈希。你可以尝试用用户名和时间戳来缓解这种情况。
您还需要进行一些检查,因为即使概率非常小,您也可能为不同的图像/用户生成相同的哈希("冲突"),并且您不希望用户覆盖另一个用户的图像。您可以通过生成图像的哈希来防止这种情况,检查它是否已经存在,如果已经存在,则在预哈希的数据中添加一些字节,重复直到哈希是唯一的。
还有一个BitConverter类,它有一个ToString()方法,可以将字节数组转换为十六进制字符串表示。
所以类似于:
BitConverter.ToString(CalculateMD5(theStream)).Replace("-","");
将获得MD5哈希的典型十六进制字符串表示。
您无法读取它,因为它是一个字节数组,需要使用适当的编码将其转换为可读字符串。
例如在SHA256类中生成散列:
using (System.Security.Cryptography.SHA256 sha = System.Security.Cryptography.SHA256.Create())
return sha.ComputeHash(data);
然后,如果你想把它变成一个字符串,把它变成可读的形式:
string hashValue = Convert.ToBase64String(hash);
当然,除了SHA256和MD5之外,还有其他用于生成哈希(有盐或无盐)的算法。
您尝试过CalculateMD5(流).ToString()吗?不确定这是否有帮助,但可能值得一试。
此外,我建议您将CalculateMD5(流)的结果保存在本地变量中,然后.ToString()it.
GL,希望有所帮助。