• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            2010年3月6日

             說(shuō)明:
                     感謝luckycat陳梓瀚(vczh) 的留言。
                     下面的代碼已經(jīng)在Windows VC6/ Cygwin/ Suse Linux環(huán)境下編譯測(cè)試通過(guò).

            #include <iostream>
            #include 
            <list>
            #include 
            <string>
            #include 
            <cctype>

            using namespace std;

            typedef unsigned 
            int    UINT32;
            typedef unsigned 
            short  UINT16;

            /************************************************************************/
            /* 枚舉定義: 性別                                         */
            /************************************************************************/
            typedef 
            enum enumSexyType
            {
                SEXY_TYPE_MAN,   
            //男性
                SEXY_TYPE_WOMAN, //女性
                SEXY_TYPE_GAY,   //男同性戀
                SEXY_TYPE_LESIBAIN, //女同性戀

                SEXY_TYPE_BUTT   
            //未知性別
            }ENUM_SEXY_TYPE;

            /************************************************************************/
            /* 結(jié)構(gòu)體定義:  人                                                      */
            /************************************************************************/
            typedef 
            struct structMan
            {
                UINT32    sexType; 
            // 性別 ENUM_SEXY_TYPE
                UINT16      usAge;   // 年齡
                string    strName; // 名字
                string    strAddress; // 工作地址
                
                
            bool operator < (const structMan &man) const
                {
                    
            return usAge < man.usAge;
                }

                
            bool operator > (const structMan &man) const
                {
                    
            return usAge > man.usAge;
                }

                structMan(UINT32 enumSexType 
            = SEXY_TYPE_MAN,\
                          UINT16 usAge 
            = 0 ,\
                          
            const string &refStrName = "" ,\
                          
            const string &refStrAddress = "")\
                          : 
                          sexType(enumSexType),\
                          usAge(usAge) ,\
                          strName(refStrName),\
                          strAddress(refStrAddress)
                {
                    
            //DO NOTHING HERE
                }; 
            }MAN;



            //////////////////////////////////////////////////////////////////////////

            typedef list
            <MAN> Family;
            typedef list
            <MAN>::iterator FamilyIterator;

            /*
             *    main函數(shù) 定義
             
            */
            int main()
            {
                
            /* 初始化 */
                MAN stFather(SEXY_TYPE_MAN,   
            28"倒霉熊老爸""華為技術(shù)有限公司");
                MAN stMother(SEXY_TYPE_WOMAN, 
            27"蝦米老媽""鄭州大學(xué)第二附屬醫(yī)院");
                MAN stBaby  (SEXY_TYPE_BUTT,  
            0,  "小天使",   "未知");
                Family myFamily;

                
            /* 依次存放到list中    */
                myFamily.push_back(stFather);
                myFamily.push_back(stMother);
                myFamily.push_back(stBaby);

                
            /* 調(diào)用list的sort函數(shù)進(jìn)行排序, 默認(rèn)會(huì)使用結(jié)構(gòu)體重載的<號(hào), 進(jìn)行從小到大排序 */
                myFamily.sort();

                printf(
            "按年齡從小到大排序:\n");
                FamilyIterator it 
            = myFamily.begin();
                
            while(it != myFamily.end())
                {
                    printf(
            "姓名: %s \n", it->strName.c_str());
                    it
            ++;
                }

                
            /* 調(diào)用模板函數(shù) greater, 傳入MAN結(jié)構(gòu)體, 這樣會(huì)調(diào)用結(jié)構(gòu)體重載的>號(hào), 進(jìn)行從大到小排序 */
                greater
            <MAN> gt;
                myFamily.sort(gt);

                printf(
            "\n按年齡從大到小排序:\n");
                it 
            = myFamily.begin();
                
            while(it != myFamily.end())
                {
                    printf(
            "姓名: %s \n", it->strName.c_str());
                    it
            ++;
                }

                
            return 0;
            }


            posted @ 2010-03-06 15:42 小蘇 閱讀(12129) | 評(píng)論 (21)編輯 收藏

            2009年10月28日

            1、下題的輸出是什么?
            typedef struct
            {
                int  num;
                char name[10];
                int  age;
            }Student,*pStudent;

            void printName(pStudent pt)
            {
                printf("%s\n",pt->name);
                return;
            }

            void main()
            {
                Student students[3]={{111, "liu", 18},
                            {222, "wang", 19},
                            {333, "zhao", 10}};
                printName(students+2);
                return;
            }

            2、選擇
            #include <stdio.h>
            void main()
            {
                union
                {
                    int k;
                    char i[2];
                }*s, a;
                s=&a;
                s->i[0]=0x39;
                s->i[1]=0x38;
                printf("%x\n", a.k);
            }

            A.3839 B.3938 C.380039 D.不可預(yù)知

            3、
            enum ENUM_A
            {
                X1,
                Y1,
                Z1=6,
                A1,
                B1
            };

            enum ENUM_A enumA=Y1;
            enum ENUM_A enumB=B1;

            enumA=_______
            enumB=_______

            4、
            VCHAR *pucCharArray[10][10];
            typedef union unRec
            {
                ULONG ulIndex;
                USHORT usLevel[6];
                UCHAR ucDos;
            }REC_S;

            REC_S stMax, *pstMax;

            四字節(jié)對(duì)齊時(shí)    sizeof(pucCharArray)=______
                       sizeof(stMax)=______
                    sizeof(*stMax)=______

            5、
            typedef union unHead
            {
                UCHAR aucSrc[6];
                struct tagContent
                {
                    UCHAR ucFlag[3];
                    ULONG ulNext;
                }Content;
            }HEAD_S;

            32位CPU,VC編譯環(huán)境下:
            強(qiáng)制一字節(jié)對(duì)齊情況下,請(qǐng)指出sizeof(HEAD_S)
            強(qiáng)制二字節(jié)對(duì)齊情況下,請(qǐng)指出sizeof(HEAD_S)
            強(qiáng)制四字節(jié)對(duì)齊情況下,請(qǐng)指出sizeof(HEAD_S)


            6、
            四字節(jié)對(duì)齊的情況下:
            typedef struct tagRec
            {
                long lA1;
                char cA2;
                char cA3;
                long lA4;
                long lA5;
            }REC_S;

            void main()
            {
                REC_S stMax;
                printf("\r\n sizeof(stMax)=%d", sizeof(stMax));
                return;
            }

            輸出結(jié)果為: sizeof(stMax)=______

            7、
            typedef struct tagtest
            {
                unsigned char ucFlag;
                unsigned long ulLen;
            }TEST_S;

            TEST_S test[10];

            四字節(jié)對(duì)其時(shí): sizeof(TEST_S)=_____ sizeof(test)=______

            8、
            #pragma pack(4)
            int main(int argc, char* argv[])
            {
                struct tagtest1
                {
                  short a;
                  char  d;
                  long  b;
                  long  c;
                }

                struct tagtest2
                {
                  long  b;
                  short c;
                  char  d;
                  long  a;
                }

                struct tagtest3
                {
                  short c;
                  long  b;
                  char  d;
                  long  a;
                }

                struct tagtest1 stT1;
                struct tagtest2 stT2;
                struct tagtest3 stT3;
                printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
                return 0;
            }
            #pragma pack()

            輸出是______

            9、
            typedef struct Head
            {
                VCHAR aucSrc[6];
                VLONG ulType;
            }HEAD_S;

            在強(qiáng)制一字節(jié)對(duì)其的情況下,sizeof(HEAD_S)=____
            在強(qiáng)制二字節(jié)對(duì)其的情況下,sizeof(HEAD_S)=____

            10、
            union tagAAAA
            {
              struct
              {
                char  ucFirst;
                short usSecond;
                char  ucThird;
              }half;
              long lI;
            }number;

            struct tagBBBB
            {
              char  ucFirst;
              short usSecond;
              char  ucThird;
              short usForth;
            }half;

            struct tagCCCC
            {
              struct
              {
                 char ucFirst;
                 short usSecond;
                 char ucThird;
              }half;
              long lI;
            };

            在字節(jié)對(duì)其為1的情況下:
            sizeof(union tagAAAA)=_____
            sizeof(struct tagBBBB)=____
            sizeof(struct tagCCCC)=____
            字節(jié)對(duì)齊為4的情況下:
            sizeof(union tagAAAA)=_____
            sizeof(struct tagBBBB)=____
            sizeof(struct tagCCCC)=____

            posted @ 2009-10-28 00:18 小蘇 閱讀(808) | 評(píng)論 (0)編輯 收藏

            2009年8月21日

             語(yǔ)言 打折率
            ASM 1.44
            C/C++ 1
            Java 0.7
            SQL 0.62
            JSP 0.7
            HTML 0.35
            XML 0.7
            JS 0.7
            SHELL 1
            VHDL 1
            Python 0.7
            VB 0.8
            Delphi 0.8
            Bat 1

            posted @ 2009-08-21 23:24 小蘇 閱讀(406) | 評(píng)論 (0)編輯 收藏

            2008年11月9日

                使用gcc生成可執(zhí)行文件時(shí),大部分時(shí)候我們需要連接我們自己打包(AR)好的一些庫(kù)文件,對(duì)于中大型(50萬(wàn)代碼行以上)項(xiàng)目上,你將面對(duì)數(shù)個(gè)項(xiàng)目組,最好的情況是每個(gè)項(xiàng)目組發(fā)布自己的打包.ar文件,這些.ar文件之間沒(méi)有任何依賴關(guān)系, 然后由持續(xù)集成(ci)小組對(duì)這些包進(jìn)行連接,不幸的是,這幾乎是不可能的, 我們?cè)谶B接時(shí)還是遇到了liba.ar和libb.ar相互依賴的情況。

            因?yàn)間cc的庫(kù)是個(gè)有點(diǎn)怪怪的特性,在看-l幫助時(shí)可以看到:
                   -l library
                       Search the library named library when linking.  (The second alter-
                       native with the library as a separate argument is only for POSIX
                       compliance and is not recommended.)

                       It makes a difference where in the command you write this option;
                       the linker searches and processes libraries and object files in the
                       order they are specified.  Thus, foo.o -lz bar.o searches library z
                       after file foo.o but before bar.o.  If bar.o refers to functions in
                       z, those functions may not be loaded.

                出于知識(shí)產(chǎn)權(quán)保護(hù)的考慮,每一個(gè)項(xiàng)目組可能只允許看到自己的代碼和別的項(xiàng)目組的頭文件,這給CI小組帶來(lái)了很頭痛的事情,很多時(shí)候你不得不把庫(kù)順序來(lái)回調(diào)整。我也遇到了這樣讓人崩潰的情形,問(wèn)題是對(duì)于liba.ar和libb.ar相互以來(lái)的情形,你可能最終采取丑陋的做法,將其中一個(gè)庫(kù)在前后放兩次:
            gcc -o out.bin liba.ar libb.ar liba.ar -lrt
            否則,您將不得不面對(duì) "xx not referenced"之類的錯(cuò)誤。

            看看gcc的幫助,有下面的選項(xiàng)
            -Xlinker option
                       Pass option as an option to the linker.  You can use this to supply
                       system-specific linker options which GCC does not know how to rec-
                       ognize.

                       If you want to pass an option that takes an argument, you must use
                       -Xlinker twice, once for the option and once for the argument.  For
                       example, to pass -assert definitions, you must write -Xlinker
                       -assert -Xlinker definitions.  It does not work to write -Xlinker
                       "-assert definitions", because this passes the entire string as a
                       single argument, which is not what the linker expects.

            也就是說(shuō),-Xlinker是將連接選項(xiàng)傳給連接器的,趕快看看ld的幫助有沒(méi)有解決庫(kù)順序的選項(xiàng)吧:
             -( archives -)
                   --start-group archives --end-group
                       The archives should be a list of archive files.  They may be either
                       explicit file names, or -l options.

                       The specified archives are searched repeatedly until no  new  unde-
                       fined  references  are  created.   Normally, an archive is searched
                       only once in the order that it is specified on  the  command  line.
                       If  a symbol in that archive is needed to resolve an undefined sym-
                       bol referred to by an object in an archive that  appears  later  on
                       the command line, the linker would not be able to resolve that ref-
                       erence.  By grouping the archives, they all be searched  repeatedly
                       until all possible references are resolved.

                       Using  this  option has a significant performance cost.  It is best
                       to use it only  when  there  are  unavoidable  circular  references
                       between two or more archives.


            不錯(cuò),我們有個(gè)有點(diǎn)怪異的選項(xiàng),-(和-),它能夠強(qiáng)制"The specified archives are searched repeatedly"
            god,這就是我們要找的啦。

            最終的做法:
            gcc -o output.bin -Xlinker "-(" liba.ar libb.ar -Xlinker "-)" -lrt

            這樣可以解決庫(kù)順序的問(wèn)題了!問(wèn)題是,如果你的庫(kù)相互間的依賴如果錯(cuò)綜復(fù)雜的話,可能會(huì)增加連接的時(shí)間,不過(guò),做架構(gòu)設(shè)計(jì)的都應(yīng)該能考慮到這些問(wèn)題吧。








            posted @ 2008-11-09 12:18 小蘇 閱讀(11035) | 評(píng)論 (3)編輯 收藏

            2008年5月1日

            理解 RSA/DSA 認(rèn)證

            Daniel Robbins (drobbins@gentoo.org)
            總裁/首席執(zhí)行官,Gentoo Technologies,Inc.
            2001 年 7 月

            在本系列文章中,您將學(xué)習(xí) RSA 和 DSA 認(rèn)證的工作原理,以及了解如何正確設(shè)置無(wú)密碼認(rèn)證。在本系列的第一篇文章里,Daniel Robbins 主要介紹 RSA 和 DSA 認(rèn)證協(xié)議并向您展示如何在網(wǎng)絡(luò)上應(yīng)用這些協(xié)議。

            我們中有許多人把優(yōu)秀的 OpenSSH(參見(jiàn)本文后面的參考資料)用作古老的 telnetrsh 命令的替代品,OpenSSH 不僅是安全的而且是加密的。OpenSSH 更加吸引人的特性之一是它能夠使用基于一對(duì)互補(bǔ)的數(shù)字式密鑰的 RSA 和 DSA 認(rèn)證協(xié)議來(lái)認(rèn)證用戶。RSA 和 DSA 認(rèn)證承諾不必提供密碼就能夠同遠(yuǎn)程系統(tǒng)建立連接,這是它的主要魅力之一。雖然這非常吸引人,但是 OpenSSH 的新用戶們常常以一種快速卻不完善的方式配置 RSA/DSA,結(jié)果雖然實(shí)現(xiàn)了無(wú)密碼登錄,卻也在此過(guò)程中開(kāi)了一個(gè)很大的安全漏洞。

            什么是 RSA/DSA 認(rèn)證?
            SSH,特別是 OpenSSH(完全免費(fèi)的 SSH 的實(shí)現(xiàn)),是一個(gè)不可思議的工具。類似于 telnetrshssh 客戶程序也可以用于登錄到遠(yuǎn)程機(jī)器。所要求的只是該遠(yuǎn)程機(jī)器正在運(yùn)行 sshd,即 ssh 服務(wù)器進(jìn)程。但是,與 telnet 不同的是,ssh 協(xié)議非常安全。加密數(shù)據(jù)流,確保數(shù)據(jù)流的完整性,甚至安全可靠的進(jìn)行認(rèn)證它都使用了專門(mén)的算法。

            然而,雖然 ssh 的確很棒,但還是有一個(gè) ssh 功能組件常常被忽略、被危險(xiǎn)的誤用或者簡(jiǎn)直就是被誤解。這個(gè)組件就是 OpenSSH 的 RSA/DSA 密鑰認(rèn)證系統(tǒng),它可以代替 OpenSSH 缺省使用的標(biāo)準(zhǔn)安全密碼認(rèn)證系統(tǒng)。

            OpenSSH 的 RSA 和 DSA 認(rèn)證協(xié)議的基礎(chǔ)是一對(duì)專門(mén)生成的密鑰,分別叫做專用密鑰公用密鑰。使用這些基于密鑰的認(rèn)證系統(tǒng)的優(yōu)勢(shì)在于:在許多情況下,有可能不必手工輸入密碼就能建立起安全的連接。

            盡管基于密鑰的認(rèn)證協(xié)議相當(dāng)安全,但是當(dāng)用戶并不完全了解這些簡(jiǎn)化操作對(duì)安全性的影響,為了方便而使用某些簡(jiǎn)化操作時(shí),就會(huì)出現(xiàn)問(wèn)題。本文中,我們 將詳細(xì)討論如何正確使用 RSA 和 DSA 認(rèn)證協(xié)議,使我們不會(huì)冒任何不必要的安全性風(fēng)險(xiǎn)。在我的下一篇文章里,我將向您展示如何使用 ssh-agent 隱藏已經(jīng)解密的專用密鑰,還將介紹 keychain,它是 ssh-agent 的前端,可以在不犧牲安全性的前提下提供許多便利。如果您一直想要掌握 OpenSSH 更高級(jí)的認(rèn)證功能的話,那么就請(qǐng)您繼續(xù)往下讀吧。

            RSA/DSA 密鑰的工作原理
            下面從整體上粗略的介紹了 RSA/DSA 密鑰的工作原理。讓我們從一種假想的情形開(kāi)始,假定我們想用 RSA 認(rèn)證允許一臺(tái)本地的 Linux 工作站(稱作 localbox)打開(kāi) remotebox 上的一個(gè)遠(yuǎn)程 shell,remotebox 是我們的 ISP 的一臺(tái)機(jī)器。此刻,當(dāng)我們?cè)噲D用 ssh 客戶程序連接到 remotebox 時(shí),我們會(huì)得到如下提示:

            % ssh drobbins@remotebox
            drobbins@remotebox's password:

            此處我們看到的是 ssh 處理認(rèn)證的缺省方式的一個(gè)示例。換句話說(shuō),它要求我們輸入 remotebox 上的 drobbins 這個(gè)帳戶的密碼。如果我們輸入我們?cè)?remotebox 上的密碼,ssh 就會(huì)用安全密碼認(rèn)證協(xié)議,把我們的密碼傳送給 remotebox 進(jìn)行驗(yàn)證。但是,和 telnet 的情況不同,這里我們的密碼是加密的,因此它不會(huì)被偷看到我們的數(shù)據(jù)連接的人截取。一旦 remotebox 把我們提供的密碼同它的密碼數(shù)據(jù)庫(kù)相對(duì)照進(jìn)行認(rèn)證,成功的話,我們就會(huì)被允許登錄,還會(huì)有一個(gè) remotebox 的 shell 提示歡迎我們。雖然 ssh 缺省的認(rèn)證方法相當(dāng)安全,RSA 和 DSA 認(rèn)證卻為我們開(kāi)創(chuàng)了一些新的潛在的機(jī)會(huì)。

            但是,與 ssh 安全密碼認(rèn)證不同的是,RSA 認(rèn)證需要一些初始配置。我們只需要執(zhí)行這些初始配置步驟一次。之后,localboxremotebox 之間的 RSA 認(rèn)證就毫不費(fèi)力了。要設(shè)置 RSA 認(rèn)證,我們首先得生成一對(duì)密鑰,一把專用密鑰和一把公用密鑰。這兩把密鑰有一些非常有趣的性質(zhì)。公用密鑰用于對(duì)消息進(jìn)行加密,只有擁有專用密鑰的人才能對(duì)該消息進(jìn)行解密。公用密鑰只能用于 加密,而專用密鑰只能用于對(duì)由匹配的公用密鑰編碼的消息進(jìn)行解密。RSA(和 DSA)認(rèn)證協(xié)議利用密鑰對(duì)的這些特殊性質(zhì)進(jìn)行安全認(rèn)證,并且不需要在網(wǎng)上傳輸任何保密的信息。

            要應(yīng)用 RSA 或者 DSA 認(rèn)證,我們要執(zhí)行一步一次性的配置步驟。我們把公用密鑰拷貝到 remotebox。公用密鑰之所以被稱作是“公用的”有一個(gè)原因。因?yàn)樗荒苡糜趯?duì)那些給我們的消息進(jìn)行 加密,所以我們不需要太擔(dān)心它會(huì)落入其它人手中。一旦我們的公用密鑰已經(jīng)被拷貝到 remotebox 并且為了 remoteboxsshd 能夠定位它而把它放在一個(gè)專門(mén)的文件(~/.ssh/authorized_keys)里,我們就為使用 RSA 認(rèn)證登錄到 remotebox 上做好了準(zhǔn)備。

            要用 RSA 登錄的時(shí)候,我們只要在 localbox 的控制臺(tái)鍵入 ssh drobbins@remotebox,就象我們常做的一樣。可這一次,ssh 告訴 remoteboxsshd 它想使用 RSA 認(rèn)證協(xié)議。接下來(lái)發(fā)生的事情非常有趣。Remoteboxsshd 會(huì)生成一個(gè)隨機(jī)數(shù),并用我們先前拷貝過(guò)去的公用密鑰對(duì)這個(gè)隨機(jī)數(shù)進(jìn)行加密。然后, sshd 把加密了的隨機(jī)數(shù)發(fā)回給正在 localbox 上運(yùn)行的 ssh。接下來(lái),輪到我們的 ssh專用密鑰對(duì)這個(gè)隨機(jī)數(shù)進(jìn)行解密后,再把它發(fā)回給 remotebox,實(shí)際上等于在說(shuō):“瞧,我確實(shí)有匹配的專用密鑰;我能成功的對(duì)您的消息進(jìn)行解密!”最后, sshd 得出結(jié)論,既然我們持有匹配的專用密鑰,就應(yīng)當(dāng)允許我們登錄。因此,我們有匹配的專用密鑰這一事實(shí)授權(quán)我們?cè)L問(wèn) remotebox

            兩項(xiàng)注意事項(xiàng)
            關(guān)于 RSA 和 DSA 認(rèn)證有兩項(xiàng)重要的注意事項(xiàng)。第一項(xiàng)是我們的確只需要生成一對(duì)密鑰。然后我們可以把我們的公用密鑰拷貝到想要訪問(wèn)的那些遠(yuǎn)程機(jī)器上,它們都會(huì)根據(jù)我們的那把專用密鑰進(jìn)行恰當(dāng)?shù)恼J(rèn)證。換句話說(shuō),我們并不需要為想要訪問(wèn)的 每個(gè)系統(tǒng)都準(zhǔn)備一對(duì)密鑰。只要一對(duì)就足夠了。

            另一項(xiàng)注意事項(xiàng)是專用密鑰不應(yīng)落入其它人手中。正是專用密鑰授權(quán)我們?cè)L問(wèn)遠(yuǎn)程系統(tǒng),任何擁有我們的專用密鑰的人都會(huì)被授予和我們完全 相同的特權(quán)。如同我們不想讓陌生人有我們的住處的鑰匙一樣,我們應(yīng)該保護(hù)我們的專用密鑰以防未授權(quán)的使用。在比特和字節(jié)的世界里,這意味著沒(méi)有人是本來(lái)就 應(yīng)該能讀取或是拷貝我們的專用密鑰的。

            ssh 的開(kāi)發(fā)者們當(dāng)然知道專用密鑰的重要性,而且他們已經(jīng)在 sshssh-keygen 里加入了一些防范措施,以防止我們的專用密鑰被濫用。首先,ssh 被設(shè)置成了如果我們的密鑰的文件權(quán)限允許除我們之外的任何人讀取密鑰,就打印出一條大大的警告消息。其次,在我們用 ssh-keygen 創(chuàng)建公用/專用密鑰對(duì)的時(shí)候,ssh-keygen 會(huì)要求我們輸入一個(gè)密碼短語(yǔ)。如果我們輸入了密碼短語(yǔ),ssh-keygen 就會(huì)用該密碼短語(yǔ)加密我們的專用密鑰,這樣,即使專用密鑰被盜,對(duì)于那些碰巧不知道密碼短語(yǔ)的人而言,這把專用密鑰是毫無(wú)用處的。具備了這一知識(shí)后,讓我們看一下如何設(shè)置 ssh 以應(yīng)用 RSA 和 DSA 認(rèn)證協(xié)議。

            ssh-keygen 細(xì)探
            設(shè)置 RSA 認(rèn)證的第一步從生成一對(duì)公用/專用密鑰對(duì)開(kāi)始。RSA 認(rèn)證是 ssh 密鑰認(rèn)證的最初形式,因此 RSA 應(yīng)該可以用于 OpenSSH 的所有版本,盡管這樣,我還是推薦您安裝可用的最近版本,在我寫(xiě)這篇文章的時(shí)候是 openssh-2.9_p2。生成一對(duì) RSA 密鑰的方法如下:

            % ssh-keygen
            Generating public/private rsa1 key pair.
            Enter file in which to save the key (/home/drobbins/.ssh/identity): (hit enter)
            Enter passphrase (empty for no passphrase): (enter a passphrase)
            Enter same passphrase again: (enter it again)
            Your identification has been saved in /home/drobbins/.ssh/identity.
            Your public key has been saved in /home/drobbins/.ssh/identity.pub.
            The key fingerprint is:
            a4:e7:f2:39:a7:eb:fd:f8:39:f1:f1:7b:fe:48:a1:09 drobbins@localbox

            當(dāng) ssh-keygen 要求輸入存放密鑰的缺省位置時(shí),我們敲回車(chē)鍵接受缺省的 /home/drobbins/.ssh/identity。ssh-keygen 將把專用密鑰保存在此路徑中,公用密鑰就存在緊臨它的一個(gè)叫做 identity.pub 的文件里。

            還要請(qǐng)您注意一下 ssh-keygen 還提示過(guò)我們輸入密碼短語(yǔ)。當(dāng)時(shí)我們輸入了一個(gè)好的密碼短語(yǔ)(七位或者更多位難以預(yù)測(cè)的字符)。然后 ssh-keygen 用這個(gè)密碼短語(yǔ)加密了我們的專用密鑰(~/.ssh/identity),以使我們的專用密鑰對(duì)于那些不知道這個(gè)密碼短語(yǔ)的人將變得毫無(wú)用處。

            追求快速的折衷方案
            當(dāng)我們指定密碼短語(yǔ)時(shí),雖然這使得 ssh-keygen 保護(hù)我們的專用密鑰以防誤用,但是也帶來(lái)了一點(diǎn)小小的不便。現(xiàn)在,每當(dāng)我們?cè)噲D用 ssh 連接到 drobbins@remotebox 帳戶時(shí),ssh 都會(huì)提示我們輸入該密碼短語(yǔ)以便它能對(duì)我們的專用密鑰進(jìn)行解密,并使用我們的專用密鑰進(jìn)行 RSA 認(rèn)證。此外,我們輸入的不是 remoteboxdrobbins 帳戶的密碼,而是在本地機(jī)器上對(duì)專用密鑰進(jìn)行解密所需要的密碼短語(yǔ)。一旦我們的專用密鑰被解密,我們的 ssh 客戶程序就會(huì)處理其余的事情。雖然使用我們的遠(yuǎn)程密碼和使用 RSA 密碼短語(yǔ)的機(jī)制完全不同,但實(shí)際上還是會(huì)提示我們輸入一個(gè)“保密的短語(yǔ)”給 ssh

            # ssh drobbins@remotebox
            Enter passphrase for key '/home/drobbins/.ssh/identity': (enter passphrase)
            Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org

            Welcome to remotebox!

            %

            這里就是人們經(jīng)常會(huì)被誤導(dǎo)而導(dǎo)致追求快速的折衷方案的地方。有很多時(shí)候,僅僅是為了不必輸入密碼,人們就會(huì)創(chuàng)建不加密的專用密鑰。那樣的話,他們只要輸入 ssh 命令,立刻就會(huì)通過(guò) RSA(或是 DSA)認(rèn)證并登錄。

            # ssh drobbins@remotebox
            Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org

            Welcome to remotebox!

            %

            然而,盡管這樣很方便,但是在還沒(méi)有完全理解這種方法對(duì)安全性的影響時(shí),您不應(yīng)該使用。如果有人在某一時(shí)刻闖入了 localbox,一把不加密的專用密鑰使得他們也自動(dòng)有權(quán)訪問(wèn) remotebox 以及其它所有用這把公用密鑰配置過(guò)的系統(tǒng)。

            我知道您在想些什么。無(wú)密碼認(rèn)證,雖然有點(diǎn)冒險(xiǎn),可看起來(lái)的確很誘人。我完全同意。但是, 還有更好的辦法!請(qǐng)相信我,我將向您展示如何既可以享受到無(wú)密碼認(rèn)證的好處,又不必犧牲專用密鑰的安全性。在我的下一篇文章里,我還將向您展示如何熟練的使用 ssh-agent(正是它最先使得安全無(wú)密碼認(rèn)證成為可能)。現(xiàn)在,讓我們通過(guò)設(shè)置 RSA 和 DSA 認(rèn)證為使用 ssh-agent 做好準(zhǔn)備。下面是逐步的指導(dǎo)。

            RSA 密鑰對(duì)的生成
            要設(shè)置 RSA 認(rèn)證,我們需要執(zhí)行生成公用/專用密鑰對(duì)的一次性步驟。我們的輸入如下:

            % ssh-keygen

            出現(xiàn)提示時(shí),請(qǐng)接受缺省的密鑰位置(典型的情況下是 ~/.ssh/identity 和存儲(chǔ)公用密鑰的 ~/.ssh/identity.pub),并提供給 ssh-keygen 一個(gè)安全的密碼短語(yǔ)。一旦 ssh-keygen 完成,您將會(huì)得到一把公用密鑰和一把用密碼短語(yǔ)加密的專用密鑰。

            RSA 公用密鑰的安裝
            接下來(lái),我們需要把正在運(yùn)行 sshd 的遠(yuǎn)程系統(tǒng)設(shè)置成使用我們的公用 RSA 密鑰進(jìn)行認(rèn)證。典型情況下,我們通過(guò)象下面這樣把公用密鑰拷貝到遠(yuǎn)程系統(tǒng)完成這一步:

            % scp ~/.ssh/identity.pub drobbins@remotebox:

            由于 RSA 認(rèn)證還沒(méi)有完全設(shè)置好,所以會(huì)提示我們輸入 remotebox 上的密碼。請(qǐng)您照做。然后,登錄到 remotebox 并把公用密鑰附加到文件 ~/.ssh/authorized_keys 上,如下所示:

            % ssh drobbins@remotebox
            drobbins@remotebox's password: (enter password)
            Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org

            Welcome to remotebox!

            % cat identity.pub >> ~/.ssh/authorized_keys
            % exit

            現(xiàn)在,配置過(guò) RSA 認(rèn)證以后,當(dāng)我們?cè)噲D使用 ssh 連接到 remotebox 時(shí),應(yīng)該會(huì)提示我們輸入 RSA 密碼短語(yǔ)(而不是我們的密碼)。

            % ssh drobbins@remotebox
            Enter passphrase for key '/home/drobbins/.ssh/identity':



            好哇,RSA 認(rèn)證的配置完成了!如果剛才沒(méi)有提示您輸入密碼短語(yǔ),您可以試驗(yàn)一下以下幾種情況。第一,嘗試通過(guò)輸入 ssh -1 drobbins@remotebox 登錄。它會(huì)讓 ssh 只應(yīng)用 ssh 協(xié)議版本 1,如果出于某種原因遠(yuǎn)程系統(tǒng)缺省設(shè)置的是 DSA 認(rèn)證的話,可能會(huì)要求這么做。如果不奏效的話,請(qǐng)確認(rèn)您的 /etc/ssh/ssh_config 里沒(méi)有寫(xiě)著這么一行 RSAAuthentication no。如果有的話,請(qǐng)您在前面加上一個(gè)“#”把這行注釋掉。另外,還可以試著同 remotebox 的系統(tǒng)管理員聯(lián)絡(luò),核實(shí)一下在他們那一端已經(jīng)啟用了 RSA 認(rèn)證,并且 /etc/ssh/sshd_config 里的設(shè)置是正確的。

            DSA 密鑰的生成
            ssh 協(xié)議的版本 1 使用的是 RSA 密鑰,而 DSA 密鑰卻用于協(xié)議級(jí) 2,這是 ssh 協(xié)議的最新版本。目前所有的 OpenSSH 版本都應(yīng)該既能使用 RSA 密鑰又能使用 DSA 密鑰。DSA 密鑰以如下類似于 RSA 密鑰的方式使用 OpenSSH 的 ssh-keygen 生成:

            % ssh-keygen -t dsa

            又會(huì)提示我們輸入密碼短語(yǔ)。輸入一個(gè)安全的密碼短語(yǔ)。還會(huì)提示我們輸入保存 DSA 密鑰的位置。正常情況下,缺省的 ~/.ssh/id_dsa 和 ~/.ssh/id_dsa.pub 就可以了。在我們一次性生成 DSA 密鑰完成后,就該把我們的 DSA 公用密鑰安裝到遠(yuǎn)程系統(tǒng)上去了。

            DSA 公用密鑰的安裝
            DSA 公用密鑰的安裝又是幾乎和 RSA 安裝完全一樣。對(duì)于 DSA,我們將要把 ~/.ssh/id_dsa.pub 文件拷貝到 remotebox,然后把它附加到 remotebox 上的 ~/.ssh/authorized_keys2 文件。請(qǐng)注意這個(gè)文件的名字和 RSA 的 authorized_keys 文件名不同。一旦配置完畢,輸入我們的 DSA 專用密鑰的密碼短語(yǔ)就應(yīng)該能登錄到 remotebox,而不需要我們輸入在 remotebox 上真正的密碼。

            下一篇
            此刻,您應(yīng)該已經(jīng)可以使用 RSA 或者 DSA 認(rèn)證了,但是在每一次新連接時(shí),您仍需輸入您的密碼短語(yǔ)。在我的下一篇文章里,我們將會(huì)了解到如何使用 ssh-agent,它確實(shí)是一個(gè)很不錯(cuò)的系統(tǒng),不僅允許我們提供密碼就建立連接,而且還使我們的專用密鑰可以在磁盤(pán)上保持加密狀態(tài)。我還將介紹 keychain,它是一個(gè)非常方便的 ssh-agent 前端,可以使 ssh-agent 比以前更可靠、更方便而且使用起來(lái)更具趣味性。在此之前,請(qǐng)就近查閱下面列出的參考資料以使您能跟上進(jìn)度。

            參考資料



            關(guān)于作者
            authorDaniel Robbins 居住在美國(guó)新墨西哥州的阿爾布開(kāi)克。他主創(chuàng)了 Gentoo Linux,這是一種用于 PC 的高級(jí) Linux,以及 Portage 系統(tǒng),是用于 Linux 的下一代移植系統(tǒng)。他還是幾本 Macmillan 出版的書(shū)籍 Caldera OpenLinux UnleashedSuSE Linux UnleashedSamba Unleashed 的投稿人。Daniel 自二年級(jí)起就與計(jì)算機(jī)結(jié)下了不解之緣,那時(shí)他最先接觸的是 Logo 程序語(yǔ)言,并沉溺于 Pac Man 游戲中。這也許就是他至今仍擔(dān)任 SONY Electronic Publishing/Psygnosis 首席圖形設(shè)計(jì)師的原因所在。Daniel 喜歡與妻子 Mary 和新出生的女兒 Hadassah 一起共度時(shí)光。您可以通過(guò) drobbins@gentoo.org 和 Daniel 聯(lián)系。

            posted @ 2008-05-01 15:54 小蘇 閱讀(1850) | 評(píng)論 (0)編輯 收藏

            2007年7月13日

            今日見(jiàn)小王同志眉頭微皺,心想這兄臺(tái)必然遇到難題,遂問(wèn)其故。果不其然,他在通過(guò)日志表統(tǒng)計(jì)用戶使用情況時(shí)創(chuàng)建試圖屢屢失敗。
            我以前也沒(méi)有做過(guò)類似的SQL,但又想這實(shí)現(xiàn)總該不難,于是拿來(lái)分析,情況如下:
            表1-日志表,表結(jié)構(gòu)如下:
            ID,F_LOGIN,MTime,ManageName 這ID是主鍵(ID在我看來(lái)都是主鍵,下文不再贅述),F_LOGIN是用戶的登陸名縮寫(xiě),MTime是用戶的操作時(shí)間,ManageName是用戶操作的模塊名稱
            表2-用戶表,結(jié)構(gòu)如下:
            ID,F_ORDER,F_LOGIN,F_USERNAME,F_DEPTNAME...,F_ORDER是用戶的順序號(hào),F(xiàn)_LOGIN是用戶的登陸名縮寫(xiě),F_USERNAME是用戶的中文名,F_DEPTNAME是用戶所在單位的名稱
            表3-部門(mén)表,結(jié)構(gòu)如下:
            ID,F_DEPTORDER,F_DEPTNAME F_DEPTORDER是部門(mén)順序號(hào),F(xiàn)_DEPTNAME是部門(mén)名稱。

            好了,就是這么三個(gè)表,客戶要求根據(jù)統(tǒng)計(jì)用戶對(duì)每個(gè)模塊的使用次數(shù),并要求按照部門(mén)順序進(jìn)行排序,并且統(tǒng)計(jì)結(jié)果排除管理帳號(hào)admin:
            怎么辦? 看到小王以前的視圖是:

            SELECT  用戶表.F_DEPTNAME, COUNT(*)
                  AS count, 部門(mén)表.F_ORDER
            FROM 日志表 INNER JOIN
                  用戶表 ON
                  日志表.F_login = 用戶表.F_LOGIN INNER JOIN
                  部門(mén)表 ON
                  用戶表.F_DEPTNAME = 部門(mén)表.F_DEPATNAME
            WHERE (日志表.F_login <> 'admin')
            GROUP BY 用戶表.F_DEPTNAME,
                  部門(mén)表.F_NO
            ORDER BY 部門(mén)表.F_NO

            郁悶,這試圖看起來(lái)沒(méi)什么問(wèn)題啊,但是一運(yùn)行問(wèn)題就來(lái)了:
            考,如果部門(mén)A的用戶都沒(méi)有使用,也就是日志表里沒(méi)有記錄,那么視圖里根本就不會(huì)顯示該單位,但是很明顯這樣不對(duì),我們需要沒(méi)有使用的單位顯示次數(shù)為0嘛,
            我想辦法不是明擺著的嘛,把"INNER JOIN 部門(mén)表"改為"RIGHT JOIN"部門(mén)表不就ok了么,好,改變:

            SELECT  用戶表.F_DEPTNAME, COUNT(*)
                  AS count, 部門(mén)表.F_ORDER
            FROM 日志表 INNER JOIN
                  用戶表 ON
                  日志表.F_login = 用戶表.F_LOGIN RIGHT JOIN
                  部門(mén)表 ON
                  用戶表.F_DEPTNAME = 部門(mén)表.F_DEPATNAME
            WHERE (日志表.F_login <> 'admin')
            GROUP BY 用戶表.F_DEPTNAME,
                  部門(mén)表.F_NO
            ORDER BY 部門(mén)表.F_NO

            運(yùn)行,又郁悶,怎么還是沒(méi)有出現(xiàn),抓耳撓腮半晌弄不明白,心想反正老子最不怕的就是困難(最怕的是美女放電^_^),我一句一句來(lái),調(diào)試、調(diào)試,終于發(fā)現(xiàn)問(wèn)題所在:
            "WHERE (日志表.F_login <> 'admin')"
            當(dāng)Right join以后,沒(méi)有操作的部門(mén)會(huì)在視圖留下一條記錄,而這條記錄只包含部門(mén)表的信息,用戶表和日志表均為NULL,NULL是沒(méi)有辦法和'admin'比較的,也就是說(shuō)NULL <> 'admin' 返回的是false,怎么辦?調(diào)整視圖join的次序,如下:
            SELECT  用戶表.F_DEPTNAME, COUNT(*)
                  AS count, 部門(mén)表.F_ORDER
            FROM 用戶表 INNER JOIN
                  部門(mén)表 ON
                  用戶表.F_DEPTNAME = 部門(mén)表.F_DEPATNAME LEFT JOIN
                  日志表 ON
                  日志表.F_login = 用戶表.F_LOGIN
            WHERE (用戶表.F_login <> 'admin')
            GROUP BY 用戶表.F_DEPTNAME,
                  部門(mén)表.F_NO
            ORDER BY 部門(mén)表.F_NO

            這樣不管怎么變,這所有用戶和部門(mén)都是有的,而且admin也過(guò)濾的,但是....不對(duì)啊,怎么沒(méi)有用戶的單位使用次數(shù)都很大啊,哦,原來(lái)是我用的count(*)
            有問(wèn)題,肯定得用sum函數(shù)啦。查查聯(lián)機(jī)叢書(shū),最后定稿如下:
            SELECT  用戶表.F_DEPTNAME,
            SUM(CASE WHEN 統(tǒng)計(jì)表.F_login IS NULL THEN 0 ELSE 1 END) as count,
            部門(mén)表.F_ORDER
            FROM 用戶表 INNER JOIN
                  部門(mén)表 ON
                  用戶表.F_DEPTNAME = 部門(mén)表.F_DEPATNAME LEFT JOIN
                  日志表 ON
                  日志表.F_login = 用戶表.F_LOGIN
            WHERE (用戶表.F_login <> 'admin')
            GROUP BY 用戶表.F_DEPTNAME,
                  部門(mén)表.F_NO
            ORDER BY 部門(mén)表.F_NO


            終于搞定了,萬(wàn)歲!!不過(guò)CASE的使用也分兩種,一種是簡(jiǎn)單CASE函數(shù),一種是CASE搜索函數(shù),聯(lián)機(jī)從書(shū)中關(guān)于when_expression 和Boolean_expression 寫(xiě)的很籠統(tǒng),我的理解when_expression就是一個(gè)值,而B(niǎo)oolean_expression是一個(gè)判斷,嗯,寫(xiě)這個(gè)破東西也婆婆媽媽的寫(xiě)了半個(gè)小時(shí),到此收筆。

            posted @ 2007-07-13 09:32 小蘇 閱讀(673) | 評(píng)論 (0)編輯 收藏

            2007年4月4日

                 摘要: 這里我們要構(gòu)建一個(gè)基于Trac的項(xiàng)目管理系統(tǒng)。代碼管理使用subversion,項(xiàng)目管理使用Trac。所需要的軟件包如下: §    Trac 0.10,Trac程序 §    Apache 2.0.59,Web服務(wù)器 §    subversion 1.4.3,...  閱讀全文

            posted @ 2007-04-04 14:55 小蘇 閱讀(2231) | 評(píng)論 (0)編輯 收藏

            2007年1月31日

            用vc寫(xiě)的QQ木馬,
            破解QQ2006鍵盤(pán)保護(hù)。
            在xp下測(cè)試通過(guò)。

            使用windows消息和鍵盤(pán)鉤子,修改QQ鍵盤(pán)保護(hù)函數(shù)地址,使其鍵盤(pán)保護(hù)失去作用。

            聲明:
            僅供vc愛(ài)好者學(xué)習(xí)參考使用,不得用于非法盜取他人QQ號(hào)碼及密碼,任何因此引起的糾紛概與本人無(wú)關(guān)。

            QQ:270083015
            Mail: findingworld@sina.com


            下載生成器: http://www.shnenglu.com/Files/findingworld/iloveqq木馬生成器.rar
            下載源碼: http://www.shnenglu.com/Files/findingworld/iloveqq木馬源碼.rar

            刪除辦法:

            1. 停掉QQ.exe和Timplatform.exe
            2. 停掉Explorer.exe 并新建此進(jìn)程
            3. 到C:\windows下 刪除loveqq.exe和hookdll.dll
            4. 刪除 HKEY_LOCAL_MACHINE->software->microsoft->windows->currentversion->run->loveqq


            如果在測(cè)試中有什么問(wèn)題,給我留言啦。

            posted @ 2007-01-31 10:39 小蘇 閱讀(2500) | 評(píng)論 (27)編輯 收藏

            2006年11月29日

                 摘要: 事件源對(duì)象 event.srcElement.tagName event.srcElement.type?捕獲釋放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按鍵 event.keyCode event.shiftKey event.altKey event.ctrlKey ...  閱讀全文

            posted @ 2006-11-29 19:35 小蘇 閱讀(888) | 評(píng)論 (0)編輯 收藏

            copied from Pankaj Kumar's Weblog


            The trade-offs in using java.util.ArrayList and java.util.LinkedList should be straight-forward, shouldn't it? At least this is what I used to think till today. But then most of my thinking around these datastructures were formed during college days, when C was the hottest language and Java and its Collection classes just didn't exist.

            Not surprisingly, it is natural for me to think of arrays as fixed size containers, where elements can be accessed at random location through O(1) operation (ie; in constant time) and insertion/deletion in the middle are O(N) operations (ie; could take time proportional to the size of the array) and hence, are better avoided. In contrast, a linked list can grow in size, access of its head or tail and insertion/deletion in the middle are all O(1) operations (assuming that you have pointer to an adjacent element).

            It is possible get around the fixed size limitation of arrays by writing a wrapper which will allocate a new array, copy the elements of the old array into the new one and then discard the old one (BTW, this is what ArrayList does). Still, the basic arrays remain a datastructure for collections of fixed size. In contrast, a linked list consists of nodes with 'pointers' to the next and previous node in the list. So, adding or removing a node is simply a matter of reassigning the pointers. Of course, this implies linear time for traversing upto an indexed node, starting from beginning or end. This simple model is very handy in deciding when to use an array and when to use a linked list.

            In Java, the ArrayList and LinkedList classes provide a uniform interface to both these datastructures and hence, destroy this simple conceptual model, so necessary to make judicious implementation decisions, in impressionable young minds of many Java programmers. Let me further elaborate this with my recent own experience.

            Today, while going over a graph traversal code, I was somewhat alarmed by the generous use of ArrayLists. This code was written by someone who perhaps had learnt programming with Java. As hinted earlier, both ArrayList and LinkedList implement List interface and support similar operations. An ArrayList can grow dynamically and allows insertion/deletion of elements. A LinkedList also allows access of elements through an index, exactly the same way as an ArrayList. This is all fine. However, the problem is that the apparent similarity in the API hides the widely different memory and time costs of these datastructures for different kinds of operations, luring the unwary to use them in dangerous ways:

            1. An empty ArrayList takes two to three times more memory than an empty LinkedList (because ArrayList would typically preallocate memory). This becomes important if you plan to keep an adjacency list of nodes for each node in the graph and you know beforehand that the nodes will have at most one or two adjacent nodes and the total number of nodes in the graph can be quite large.

            2. The following straight-forward loop to iterate over all elements of a list


              ??for (int i = 0; i < list.size(); i++)
              ????doSomething(list.get(i));


              works great for an ArrayList but will cause serious performance problems for a LinkedList. Can you guess why? The right way to iterate over a LinkedList is:


              ??ListIterator li = list.listIterator(0);
              ??while (li.hasNext())
              ????doSomething(li.next());


            3. Although both ArrayList and LinkedList allow insertion/deletion in the middle through similar operations (ie; by invoking add(int index) or remove(index)), these operations do not offer you the advantage of O(1) insertion/deletion for a LinkedList. For that, you must work through a ListIterator.

            While researching on this topic, I did find a couple of good articles on the Web:


            • JDC Tech Tip article on Using ArrayList/LinkedList. Good coverage of the topic. Worth reading if you want to know more about performance tradeoffs.
            • joustlog entry titled LinkedList vs. ArrayList performance tests and subsequent clarification. This entry is more focussed in scope, pointing out the fact that addition as the end is faster for ArrayList than for LinkedList. The only thing I would like to add is that addition at the end of a LinkedList is always O(1) whereas addition at the end of an ArrayList is amortized O(1), meaning if you do M at-the-end additions then the total cost will be proportional to M. This is due to the fact that the underlying array may have to be grown (a new one to be allocated, old one to be copied and discarded) when the capacity is reached. However, I can understand that a normal at-the-end addition (ie; not involving resizing of the underlying array) will be faster for ArrayList (compared to LinkedList).

            I am not advocating either ArrayList or LinkedList, though it can be justifiably argued that the use of ArrayList is better suited in many more programming scenarios, and I have no contention with that. The point I am making is that the sameness of the API makes it easy for programmers to assume that these can be used interchangeably. Nothing can be farther from truth. They are distinct datastructures, each optimized for certain kinds of operations and domain of applicability. And a good programmer should be aware of the distinction. The API exposed by the above mentioned Java classes blur this distinction. In my opinion, this is one of those areas where implementation hiding behind a common, easy-to-use interface (think of List interface that both ArrayList and LinkedList implement) may not be in the best interest of the primary user of these classes.

            posted @ 2006-11-29 00:05 小蘇 閱讀(402) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題  下一頁(yè)
            97r久久精品国产99国产精| 精品一区二区久久| 日日狠狠久久偷偷色综合免费 | 久久水蜜桃亚洲av无码精品麻豆 | 亚洲中文精品久久久久久不卡| 久久精品国产亚洲AV久| 久久精品国产亚洲av麻豆色欲| 精品久久一区二区| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 热RE99久久精品国产66热| 亚洲欧洲精品成人久久曰影片| 久久久久久精品成人免费图片| 久久精品99久久香蕉国产色戒| 久久久久人妻一区精品 | 99热成人精品免费久久| 伊人久久亚洲综合影院| 韩国三级大全久久网站| 中文字幕无码av激情不卡久久| 国产欧美一区二区久久| 亚洲国产精品无码久久久不卡| 国内精品久久久久久中文字幕| 亚洲AV日韩精品久久久久久久 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 国内精品久久人妻互换| 久久久一本精品99久久精品88| 国产免费久久久久久无码| 看久久久久久a级毛片| 亚洲精品99久久久久中文字幕| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久精品桃花综合| 国产精品久久久久aaaa| 国产成人综合久久精品红| 久久久久亚洲爆乳少妇无| 91久久精品电影| 久久精品一区二区| 91精品观看91久久久久久| 久久精品无码一区二区三区| 91久久成人免费| 精品久久久久国产免费| 国产精品欧美久久久久天天影视 | 成人久久精品一区二区三区|