2017-08-27 5 views
-1

私は電話確認のための6桁のハッシュを生成するクールな方法を持っています。特定の一定の時間間隔内にはどのような変数が有効ですか?

コードは保存されませんが、その特定の電話と、ユーザーが使用する前に期限切れになったコードの発行につながる発行時間を含む他の変数を操作することによって計算されます。

どのようにして、特定の時間間隔の間に定数を保持して、それを含む時間変数を取得して、コードが自動的に期限切れになるようにすることができますか?

public string getTimeVariable(long minutes) 
{ 
    var now=DateTime.Now; 
    //Some imprementation I cant think of.... 
} 

public bool verifyVariable(string variable) 
{ 
    //Some other implementation to return true if specified minutes haven't elapsed since variable was issued 
} 
+0

一定の期間が経過すると有効期限が切れるクッキーが必要ですか?あなたの質問はかなり不明です。どこにでもコードを格納することはできず、アセンブリにコンパイルするだけです。 – HimBromBeere

+0

クッキーが変数でない場合 – konzo

+0

達成したいことを説明するコードを表示する必要があります。 – HimBromBeere

答えて

1

このコードを検討すると、前回の期間有効だったコードが表示されていることがわかります。毎秒コードが変わります。期間のサイズと有効期間と見なされている過去の期間の数を変更することができます。

ところで、あなたのクールな方法は何ですか?

using System; 
using System.Text; 
using System.Threading; 

public class Test { 

private static long secret = 0xdeadbeef; 
private static int digits = 6; 
private static int period_size_in_seconds = 1; 

public string phonenumber; 
public int validperiods; 

private string reference(long delta) { 
    // get current minute (UTC) 
    long now = DateTime.Now.ToUniversalTime().ToFileTimeUtc(); 
    now /= (period_size_in_seconds * 10000000); 
    // factor in phone number 
    var inputBytes = Encoding.ASCII.GetBytes(phonenumber); 
    long mux = 0; 
    foreach(byte elem in inputBytes) { 
    mux ^= elem; 
    mux <<= 1; 
    } 
    // limit number of digits 
    long mod = Convert.ToInt64(Math.Pow(10, digits)) - 1; // how many digits? 
    // apply time shift for validations 
    now -= delta; 
    // and play a little bit 
    now *= mux; // factor in phone number 
    now ^= secret; // play a bit 
    now >>= 1; // with the number 
    if (0 != (now & 0x1)) { // to make the code 
    now >>= 1; // read about LFSR to learn more 
    now ^= secret; // less deterministic 
    } 
    now = Math.Abs(now); 
    now %= mod; // keep the output in range 
    return now.ToString().PadLeft(digits, '0'); 
} 

public string getTimeVariable() { 
    return reference(0); 
} 

public bool verifyVariable(string variable) { 
    for (int i = 0; i < validperiods; i++) { 
    if (variable == reference(i)) { 
    return true; 
    } 
    } 
    return false; 
} 

public void test() { 
    phonenumber = "+48602171819"; 
    validperiods = 900; 
    string code = getTimeVariable(); 

    if (verifyVariable(getTimeVariable())) 
    System.Console.Write("OK1"); 

    if (verifyVariable(code)) 
    System.Console.Write(" OK2"); 

    Thread.Sleep(2*1000*period_size_in_seconds); 

    if (verifyVariable(code)) { 
    System.Console.WriteLine(" OK3"); 
    } 

    System.Console.WriteLine(code); 
} 

public static void Main() { 
    (new Test()).test(); 
} 
} 
+0

感謝の2が必要になると思うし始めています間にいろいろ書いを必要とし、クールな方法は、ちょうど数NAと私は、私とすぐにこれを試してみますcollitionを減らす方法で、6桁の数字であり、変換ハッシュ私のコンピュータに達する...あなたの時間に感謝を働いた – konzo

+0

まあ.. – konzo

関連する問題