K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

导航

Google Maps API 2.0解析(18-GValidateKey进行api key验证的函数)

        下面是API的Key验证函数,其中包含api key的生成方法,感兴趣的可以看一看
        //这个是Google的key算法,更具一个完整的网址路径,计算出key,这个具体的算法就不分析了,下面的几个方法也是辅助性的
        function getApiKey(a)
        
{
            
var b=[1518500249,1859775393,2400959708,3395469782];
            a
+=String.fromCharCode(128);
            
var c=a.length;
            
var d=ib(c/4)+2;
            
var e=ib(d/16);
            
var f=new Array(e);
            
for(var g=0;g<e;g++)
            
{
                f[g]
=new Array(16);
                
for(var h=0;h<16;h++)
                
{
                    f[g][h]
=a.charCodeAt(g*64+h*4)<<24|a.charCodeAt(g*64+h*4+1)<<16|a.charCodeAt(g*64+h*4+2)<<8|a.charCodeAt(g*64+h*4+3)
                }

            }

            f[e
-1][14]=(c-1>>>30)*8;
            f[e
-1][15]=(c-1)*8&4294967295;
            
var i=1732584193;
            
var l=4023233417;
            
var n=2562383102;
            
var p=271733878;
            
var t=3285377520;
            
var v=new Array(80);
            
var z,
            y,B,F,T;
            
for(var g=0;g<e;g++)
            
{
                
for(var M=0;M<16;M++)
                
{
                    v[M]
=f[g][M]
                }

                
for(var M=16;M<80;M++)
                
{
                    v[M]
=yc(v[M-3]^v[M-8]^v[M-14]^v[M-16],1)
                }

                z
=i;
                y
=l;
                B
=n;
                F
=p;
                T
=t;
                
for(var M=0;M<80;M++)
                
{
                    
var ta=getMathFloor(M/20);
                    
var bb=yc(z,5)+Sd(ta,y,B,F)+T+b[ta]+v[M]&4294967295;
                    T
=F;
                    F
=B;
                    B
=yc(y,30);
                    y
=z;
                    z
=bb
                }

                i
=i+z&4294967295;
                l
=l+y&4294967295;
                n
=n+B&4294967295;
                p
=p+F&4294967295;
                t
=t+T&4294967295
            }

            
return Hb(i)+Hb(l)+Hb(n)+Hb(p)+Hb(t)
        }

        
function Sd(a,b,c,d)
        
{
            
switch(a)
            
{
                
case 0:return b&c^~b&d;
                
case 1:return b^c^d;
                
case 2:return b&c^b&d^c&d;
                
case 3:return b^c^d
            }

        }

        
function yc(a,b)
        
{
            
return a<<b|a>>>32-b
        }

        
function Hb(a)
        
{
            
var b="";
            
for(var c=7;c>=0;c--)
            
{
                
var d=a>>>c*4&15;
                b
+=d.toString(16)
            }

            
return b
        }
;
        
//这个是Google的一个网站列表,当然,只算那种国家域名的,很奇怪为什么没有Google.cn
        var googleSiteList=
        
{
            co:
            
{
                ck:
1,cr:1,hu:1,id:1,il:1,"in":1,je:1,jp:1,ke:1,kr:1,ls:1,nz:1,th:1,ug:1,uk:1,ve:1,vi:1,za:1
            }

            ,com:
            
{
                ag:
1,ar:1,au:1,bo:1,br:1,bz:1,co:1,cu:1,"do":1,ec:1,fj:1,gi:1,gr:1,gt:1,hk:1,jm:1,ly:1,mt:1,mx:1,my:1,na:1,nf:1,ni:1,np:1,pa:1,pe:1,ph:1,pk:1,pr:1,py:1,sa:1,sg:1,sv:1,tr:1,tw:1,ua:1,uy:1,vc:1,vn:1
            }

            ,off:
            
{
                ai:
1
            }

        }
;
        
//验证用户的key,参数是key
        function GValidateKey(a)
        
{
            
//验证是否是Google拥有的域名
            if(ValidateHost(window.location.host))
            
{
                
return true
            }

            
//本地文件直接通过验证,便于调试
            if(window.location.protocol=="file:")
            
{
                
return true
            }

            
var b=getLocationList(window.location.protocol,window.location.host,window.location.pathname)
            ;
            
for(var c=0;c<b.length;++c)
            
{
                
var d=b[c];
                
//通过网址生成key,只要有一个key对应,就可以验证通过
                var e=getApiKey(d);
                
if(a==e)
                
{
                    
return true
                }

            }

            
return false
        }

        
function getLocationList(protocol,host,pathname)
        
{
            
var d=[];
            
var e=[protocol];
            
//如果使用https访问,则可以使用http的key
            if(protocol=="https:")
            
{
                e.unshift(
"http:")
            }

            host
=host.toLowerCase();
            
var f=[host];
            
var g=host.split(".");
            
//网址前面的www有没有不影响key
            if(g[0]=="www")
            
{
                g.shift()
            }

            
else
            
{
                g.unshift(
"www")
            }

            f.push(g.join(
"."));
            
//规范path的格式
            pathname=pathname.split("/");
            
var h=[];
            
while(c.length>1)
            
{
                c.pop();
                h.push(c.join(
"/")+"/")
            }

            
for(var i=0;i<e.length;++i)
            
{
                
for(var l=0;l<f.length;++l)
                
{
                    
for(var n=0;n<h.length;++n)
                    
{
                        
//通过添加生成一个网址列表,可以用这个网址列表之中任何一个可能的key
                        d.push(e[i]+"//"+f[l]+h[n])
                    }

                }

            }

            
return d
        }

        
function ValidateHost(a)
        
{
            
var b=a.toLowerCase().split(".");
            
//如果不是域名而是机器名,验证不通过
            if(b.length<2)
            
{
                
return false
            }

            
//取域名的后两个单位
            var c=b.pop();
            
var d=b.pop();
            
//igoogle.com和gmodules.com直接验证通过
            if((d=="igoogle"||d=="gmodules")&&c=="com")
            
{
                
return true
            }

            
//将Google的一些国家域名验证通过
            if(c.length==2&&b.length>0)
            
{
                
if(googleSiteList[d]&&googleSiteList[d][c]==1)
                
{
                    d
=b.pop()
                }

            }

            
return d=="google"
        }

        setWindows(
"GValidateKey",GValidateKey);

posted on 2006-08-18 17:20  K_Reverter  阅读(2951)  评论(4编辑  收藏  举报