[英]How to pull specific data from a Base64String?
這與如何生成在24小時后失效的唯一令牌直接相關嗎?
我正在嘗試做的是嵌入以下內容:
到目前為止,我的代碼是:
private string GenerateToken(Int32 pageNumber)
{
byte[] currentTimeStamp = BitConverter.GetBytes(DateTime.UtcNow.ToBinary());
byte[] key = Guid.NewGuid().ToByteArray();
byte[] newPageNumber = BitConverter.GetBytes(pageNumber);
string token = Convert.ToBase64String(newPageNumber.Concat(currentTimeStamp).Concat(key).ToArray());
return token;
}
private tokenClass TokenAuthenticates(string token)
{
byte[] data = Convert.FromBase64String(token);
tokenClass _token = new tokenClass()
{
PageNumber = 0,
TokenDateTimeStamp = DateTime.FromBinary(BitConverter.ToInt64(data, 1)),
TokenKey = new Guid(),
Validates = (DateTime.FromBinary(BitConverter.ToInt64(data, 1)) < DateTime.UtcNow.AddHours(-2))
};
return _token;
}
解碼器中的page和Guid參數尚未確定,因此它們基本上是虛擬的。
我需要做些什么才能使這項工作?
像這樣生成令牌:
private static string GenerateToken(Int32 pageNumber)
{
byte[] currentTimeStamp = BitConverter.GetBytes(DateTime.UtcNow.ToBinary());
var keyGuid = Guid.NewGuid();
byte[] key = keyGuid.ToByteArray();
byte[] newPageNumber = BitConverter.GetBytes(pageNumber);
// date plus page number plus key
string token = Convert.ToBase64String(currentTimeStamp.Concat(newPageNumber).Concat(key).ToArray());
return token;
}
像這樣讀取令牌(在TokenAuthenticates
方法中):
byte[] data = Convert.FromBase64String(token);
// It will take eight bytes starting at index 0
DateTime when = DateTime.FromBinary(BitConverter.ToInt64(data, 0));
// 8 first bytes was taken by date so lets skip 8 and then take 4 since page number is an integer and takes 4 bytes
int pageNumber = BitConverter.ToInt32(data.Skip(8).Take(4).ToArray(), 0);
// 8 bytes for date + 4 bytes for page number so we skip 12 and then take 16 for Guid
// Guid can be generated directly from the bytes
Guid key = new Guid(data.Skip(12).Take(16).ToArray());
這樣您就不必對數字進行硬編碼或確定大小。 使用sizeof
運算符可以為您確定:
int pageNumber = BitConverter.ToInt32(data.Skip(sizeof(long))
.Take(sizeof(int)).ToArray(), 0);
// Skip date and pageNumber, the rest is Guid
Guid key = new Guid(data.Skip(sizeof(long) + sizeof(int)).ToArray());
我將其稱為AuthenticateToken
方法,因為它是一個動作動詞,聽起來更易讀和清晰。 閱讀令牌后,您可以執行進一步的驗證。 您可能還需要考慮加密令牌。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.