java - 需要一个加密,验证算法
PHPz
PHPz 2017-04-18 10:52:04
0
6
820

/**
获取随机密码
date的格式是年月日yymmdd,privatyKey为10位左右的字母数字组合串
1.需要返回8位纯数字
2.须使用date,privatyKey来生成
3.每次调用都是随机生成的(在date、privatyKey相同的情况下,返回的结果也要不同),尽量保证低重复率
**/
getPassword(date,privatyKey){

}

/**
检测密码
getPassword生成的密码可以通过检测,随便输入的密码通不过检测
**/
checkPassword(date,privatyKey,password){

}

有什么合适的算法?

PHPz
PHPz

学习是最好的投资!

membalas semua(6)
左手右手慢动作
1. 从date和privateKey生成一个单向函数,如 `f(num) = SHA256(num ++ date ++ privateKey)` (++表示字符串拼接)
2. 随机生成一个3位数字a, 计算 `b = f(a)`
3. 取 `c = b中的前5位数字`, 返回 `a ++ c`

Masalah yang tidak dapat dielakkan: Terdapat terlalu sedikit perkara yang boleh disimpan dalam nombor 8 digit (1e8 或 2^30).
Jadi kaedah ini hampir tahan sepenuhnya terhadap keletihan Penyerang hanya perlu membetulkan 3 bit pertama dan menghabiskan 5 bit terakhir.
Apabila menggunakannya, algoritma itu sendiri mesti dirahsiakan, atau sekatan seperti bilangan percubaan mesti ditambah.


Varian yang meningkatkan sedikit kesukaran keletihan:

2. 第一次生成时返回f(1)的前8位数字 第二次生成时返回f(2)的前8位, ...
3. 检验时生成f(1) ~ f(100),检查输入是否属于这个集合
伊谢尔伦

boleh menggunakan fungsi cincang siap pakai (seperti sha256) pada (date, pkey). Hasilnya biasanya lebih daripada 8 digit maklumat berangka tulen. Bahagikan maklumat ini kepada kepingan kecil dan kembalikan satu bahagian secara rawak.

getpass(date, pkey) {
  passwords[10] = sha256(date, pkey);
  return passwords[random(1,10)];
}

checkpass(date, pkey, pass) {
  passwords[10] = sha256(date, pkey);
  return (pass in passwords);
}
大家讲道理

Cuba gunakan MD5

Peter_Zhu

Jika anda ingin mengembalikan hasil yang berbeza setiap kali, anda boleh menggunakan TripleDes

Tetapi hasilnya hanya boleh menjadi nombor tulen 8 digit, yang cukup memalukan

Ty80

md5, openssl agak mudah

洪涛

Penyelesaian terakhir mengambil sebahagian daripada nilai selepas pencincangan

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan