2017-10-05 83 views
0

我正在使用IDataProtector在存儲到數據庫之前加密我的數據。所有字符串做工精細,例如:.net Core 2.0保護日期時間

LastName = _protector.Protect(student.LastName) 

但是我不能使用保護:

public DateTime EnrollmentDate { get; set; } 

使用:

Student nstudent = new Student 
     { 
      LastName = _protector.Protect(student.LastName), 
      EnrollmentDate = _protector.Protect(student.EnrollmentDate) 
     }; 

我得到這個錯誤:

cannot convert from 'System.DateTime' to 'byte[]' 
+0

DataProtector很簡單,它知道如何一個byte []進行加密。作爲*便利*有一個處理字符串的擴展方法。但這就是它結束的地方。如果你想利用它,你需要將DateTime轉換爲byte []。像BitConverter.GetBytes(dt.ToBinary())一樣。或者認爲加密日期沒有意義。 –

回答

0

不能保護/取消保護,以並從一個固定長度的數據類型如DateTime。字符串的擴展方法會創建一個byte[]表示形式,對其進行加密,然後創建受保護值的base64字符串表示形式。這是有效的,因爲受保護和不受保護的字符串可以具有不同的長度。但DateTime是一個具有固定長度的結構,即使您使用支持long tick計數,它只會給你4個字節。這要求您使用不同的表示來存儲受保護的值。

所以你可以有

byte[] protectedDateTime = protector.Protect(BitConverter.GetBytes(student.EnrollmentDate.Ticks)); 
DateTime unprotectedDateTime = new DateTime(ticks: BitConverter.ToInt64(protector.Unprotect(protectedDateTime), 0)); 
+0

在不同平臺上的.NET實現中,Ticks是否具有一致的價值?如果不是,則應使用ISO日期字符串代替,除非系統總是在同一機器/體系結構上保護/取消保護 –

+1

是的,它是一個公共API幷包含從0001年1月1日午夜起經過的100納秒間隔的數量作爲'long'(64位有符號整數) –

+0

不錯,他們照顧到了這一點,因爲各種操作系統在內部使用不同的「開始」日期,如果嘗試將這個值移動到周圍, Ť –

2

可能您需要使用字符串代替

string sEnrollmentDate = _protector.Protect(student.EnrollmentDate.ToString()) 

注意到了toString將保護日期的本地化的文本形式,所以你最好使用一些返回的ISO日期字符串替代方法(見Given a DateTime object, how do I get an ISO 8601 date in string format?

+0

謝謝,無法將其轉換爲字符串。更新我的問題。 – hncl

+0

當你說不能轉換它時,你是什麼意思?這個想法是,你將ISO日期字符串傳遞給保護器而不是日期,然後將保護器返回的內容保存爲字符串(而不是DateTime對象)。然後解密時,你會找回一個字符串並將其從ISO日期字符串格式轉換爲DateTime對象 –

+0

創建答案以解釋爲什麼在不使用其他數據類型來存儲受保護值的情況下這是不可能的。 –