diff --git a/Oqtane.Server/Pages/Files.cshtml.cs b/Oqtane.Server/Pages/Files.cshtml.cs
index 97fc2c57..7be27e89 100644
--- a/Oqtane.Server/Pages/Files.cshtml.cs
+++ b/Oqtane.Server/Pages/Files.cshtml.cs
@@ -137,15 +137,15 @@ namespace Oqtane.Pages
string downloadName = file.Name;
string filepath = _files.GetFilePath(file);
+ var etagInput = $"{file.ModifiedOn.Ticks}:{file.Size}";
+
if (Request.QueryString.HasValue)
{
- etag = Utilities.GenerateSimpleHash(Request.QueryString.Value);
- }
- else
- {
- etag = Convert.ToString(file.ModifiedOn.Ticks ^ file.Size, 16);
+ etagInput += $":{Request.QueryString.Value}";
}
+ etag = Utilities.GenerateHashMD5(etagInput);
+
var header = "";
if (HttpContext.Request.Headers.TryGetValue(HeaderNames.IfNoneMatch, out var ifNoneMatch))
{
diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs
index 826fac70..d38fe490 100644
--- a/Oqtane.Shared/Shared/Utilities.cs
+++ b/Oqtane.Shared/Shared/Utilities.cs
@@ -5,6 +5,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
+using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using File = Oqtane.Models.File;
@@ -619,6 +620,13 @@ namespace Oqtane.Shared
}
}
+ public static string GenerateHashMD5(string input)
+ {
+ var bytes = Encoding.UTF8.GetBytes(input);
+ var hashBytes = MD5.HashData(bytes);
+ return Convert.ToHexString(hashBytes);
+ }
+
[Obsolete("ContentUrl(Alias alias, int fileId) is deprecated. Use FileUrl(Alias alias, int fileId) instead.", false)]
public static string ContentUrl(Alias alias, int fileId)
{