構(gòu)造TCP ISN生成器的一些更直接的方法是:簡單地選取一些隨機(jī)數(shù)作為ISN。這就是給定一個(gè)32位的空間,指定 ISN = R(t)。(假設(shè)R()是完全的非偽隨機(jī)數(shù)生成函數(shù))
固然,對于完全隨機(jī)的ISN值,攻擊者猜測到的可能性是1/232是,隨之帶來的一個(gè)問題是ISN空間里面的值的互相重復(fù)。這違反了許多RFC(RFC 793, RFC 1185, RFC 1323, RFC1948等)的假設(shè)----ISN單調(diào)增加。這將對TCP協(xié)議的穩(wěn)定性和可靠性帶來不可預(yù)計(jì)的問題。
其它一些由Niels Provos(來自O(shè)penBSD 組織)結(jié)合完全隨機(jī)方法和RFC 1948
解決方案:
ISN = ((PRNG(t)) << 16) + R(t) 32位
其中
PRNG(t) :一組隨機(jī)指定的連續(xù)的16位數(shù)字 0x00000000 -- 0xffff0000
R(t) :16位隨機(jī)數(shù)生成器(它的高位msb設(shè)成0)0x00000000 -- 0x0000ffff
上面的公式被用于設(shè)計(jì)OpenBsd的ISN生成器,相關(guān)的源代碼可以從下面的網(wǎng)址獲得
http://www.openbsd.org/cgi-bin/cvsweb/src/sys/netinet/tcp_subr.c
Provos的實(shí)現(xiàn)方法有效地生成了一組在給定時(shí)間內(nèi)的不會(huì)重復(fù)的ISN的值,每兩個(gè)ISN值都至少相差32K,這不但避免了隨機(jī)方法造成的ISN的值的沖突,而且避免了因?yàn)楣:瘮?shù)計(jì)算帶來的性能上的下降,但是,它太依賴于系統(tǒng)時(shí)鐘,一旦系統(tǒng)時(shí)鐘狀態(tài)給攻擊者知道了,就存在著系統(tǒng)的全局ISN狀態(tài)泄密的危機(jī)。