我正在處理與業務相關的程序,所以我需要知道系統日期是否正確 - 與遠程服務器進行了比較。你如何做到這一點在.NET .NET winforms?如何檢查系統日期是否正確? (以防止濫用)vb .NET
P.S:另外,有什麼辦法可以在系統時鐘發生變化時引發一些事件來防止黑客?我不希望用戶在登錄帳戶後更改本地日期。
在此先感謝。
我正在處理與業務相關的程序,所以我需要知道系統日期是否正確 - 與遠程服務器進行了比較。你如何做到這一點在.NET .NET winforms?如何檢查系統日期是否正確? (以防止濫用)vb .NET
P.S:另外,有什麼辦法可以在系統時鐘發生變化時引發一些事件來防止黑客?我不希望用戶在登錄帳戶後更改本地日期。
在此先感謝。
您需要使用外部服務器驗證時鐘,並在某個容差範圍內接受該時鐘。所有時鐘在某種程度上都是錯誤的。通常服務器上的web服務就夠了,但有很多免費的NTP-services。但是請注意,我需要5分鐘才能繞過該操作,因此爲了提高安全性,您需要使用SSL(HTTPS)(使man-in-the-middle attacks不可能)。然而
注:
如果您想知道用戶何時更改時鐘,只需設置一個線程以60秒的Thread.Sleep(60000)循環。然後檢查60秒前的當前日期時間。從上次檢查開始,它應該始終爲60秒 -/+ 1秒。 (+/- 1秒,以補償像應用延誤定時器正在執行略微掛等)
我一起扔一個簡單的例子:
編輯:對不起,第一樣品是在C#。在VB.Net中重做它。
Imports System.Threading
Public Class Form1
Private TimeMonitorThread As Thread
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
TimeMonitorThread = New Thread(TimeMonitorThreadLoop)
TimeMonitorThread.Name = "TimeMonitorThread"
TimeMonitorThread.IsBackground = True
TimeMonitorThread.Start()
End Sub
Private Sub TimeMonitorThreadLoop()
Dim sleepSeconds As Integer = 60
Dim tolerance As Integer = 1
While (True)
Dim before As DateTime = DateTime.Now
Thread.Sleep(sleepSeconds * 1000)
Dim after As DateTime = DateTime.Now
If (Math.Abs(CInt(after.Subtract(before).TotalSeconds) - sleepSeconds) > tolerance) Then
' Time has changed!
End If
End While
End Sub
End Class
只是在理論上的步驟。
首先,在遠程服務器中創建一個asp.net應用程序,該應用程序將提供當前日期時間。爲確保增加安全性,請加密當前日期。
然後在您的PC中創建一個可以訪問該遠程服務器並根據需要獲取當前時間的winform應用程序。
然後在你的winform應用程序中檢索當前的日期時間。然後,只需比較遠程服務器和winform應用程序中顯示的當前時間。
您可以根據需要調整您的PC當前日期時間,以便與遠程服務器時間同步。在商業應用的情況下,您可以通知用戶或禁用應用程序功能,直到用戶按照您的意願執行某項操作爲止。例如,打電話給您的服務部門或獲取解鎖密鑰等。
在。提交Tedd漢森淨VB代碼,請務必在私人小組Form1_Load的改變行之一: -
TimeMonitorThread = New Thread(AddressOf TimeMonitorThreadLoop)
(addressof必須有,否則你將得到一個異常)
很好的解釋,謝謝。我會這樣做。 – EvanBlack 2011-03-29 01:06:13