• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            openssl使用手冊

            Posted on 2010-01-06 11:02 S.l.e!ep.¢% 閱讀(798) 評論(0)  編輯 收藏 引用 所屬分類: Encryption
            openssl使用手冊
            來源: ChinaUnix博客  日期: 2009.06.29 08:10 (共有0條評論) 我要評論
            ?


            OpenSSL有兩種運行模式:交互模式和批處理模式。
            直接輸入openssl回車進入交互模式,輸入帶命令選項的openssl進入批處理模式。
            (1) 配置文件
            OpenSSL的默認配置文件位置不是很固定,可以用openssl ca命令得知。
            你也可以指定自己的配置文件。
            當前只有三個OpenSSL命令會使用這個配置文件:ca, req, x509。有望未來版本會有更多命令使用配置文件。
            (2)消息摘要算法
            支持的算法包括:MD2, MD4, MD5, MDC2, SHA1(有時候叫做DSS1), RIPEMD-160。SHA1和RIPEMD-160產生160位哈西值,其他的產生128位。除非出于兼容性考慮,否則推薦使用SHA1或者RIPEMD-160。
            除了RIPEMD-160需要用rmd160命令外,其他的算法都可用dgst命令來執行。
            OpenSSL對于SHA1的處理有點奇怪,有時候必須把它稱作DSS1來引用。
            消息摘要算法除了可計算哈西值,還可用于簽名和驗證簽名。簽名的時候,對于DSA生成的私匙必須要和DSS1(即SHA1)搭配。而對于RSA生成的私匙,任何消息摘要算法都可使用。

            #############################################################
            # 消息摘要算法應用例子
            # 用SHA1算法計算文件file.txt的哈西值,輸出到stdout
            $ openssl dgst -sha1 file.txt
            # 用SHA1算法計算文件file.txt的哈西值,輸出到文件digest.txt
            $ openssl sha1 -out digest.txt file.txt
            # 用DSS1(SHA1)算法為文件file.txt簽名,輸出到文件dsasign.bin
            # 簽名的private key必須為DSA算法產生的,保存在文件dsakey.pem中
            $ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt
            # 用dss1算法驗證file.txt的數字簽名dsasign.bin,
            # 驗證的private key為DSA算法產生的文件dsakey.pem
            $ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
            # 用sha1算法為文件file.txt簽名,輸出到文件rsasign.bin
            # 簽名的private key為RSA算法產生的文件rsaprivate.pem
            $ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
            # 用sha1算法驗證file.txt的數字簽名rsasign.bin,
            # 驗證的public key為RSA算法生成的rsapublic.pem
            $ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

            (3) 對稱密碼
            OpenSSL支持的對稱密碼包括Blowfish, CAST5, DES, 3DES(Triple DES), IDEA, RC2, RC4以及RC5。OpenSSL 0.9.7還新增了AES的支持。很多對稱密碼支持不同的模式,包括CBC, CFB, ECB以及OFB。對于每一種密碼,默認的模式總是CBC。需要特別指出的是,盡量避免使用ECB模式,要想安全地使用它難以置信地困難。
            enc命令用來訪問對稱密碼,此外還可以用密碼的名字作為命令來訪問。除了加解密,base64可作為命令或者enc命令選項對數據進行base64編碼/解碼。
            當你指定口令后,命令行工具會把口令和一個8字節的salt(隨機生成的)進行組合,然后計算MD5 hash值。這個hash值被切分成兩部分:加密鑰匙(key)和初始化向量(initialization vector)。當然加密鑰匙和初始化向量也可以手工指定,但是不推薦那樣,因為容易出錯。

            #############################################################
            # 對稱加密應用例子
            # 用DES3算法的CBC模式加密文件plaintext.doc,
            # 加密結果輸出到文件ciphertext.bin
            $ openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin
            # 用DES3算法的OFB模式解密文件ciphertext.bin,
            # 提供的口令為trousers,輸出到文件plaintext.doc
            # 注意:因為模式不同,該命令不能對以上的文件進行解密
            $ openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers
            # 用Blowfish的CFB模式加密plaintext.doc,口令從環境變量PASSWORD中取
            # 輸出到文件ciphertext.bin
            $ openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD
            # 給文件ciphertext.bin用base64編碼,輸出到文件base64.txt
            $ openssl base64 -in ciphertext.bin -out base64.txt
            # 用RC5算法的CBC模式加密文件plaintext.doc
            # 輸出到文件ciphertext.bin,
            # salt、key和初始化向量(iv)在命令行指定
            $ openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K
            89D4B1678D604FAA3DBFFD030A314B29

            (4)公匙密碼
            4.1 Diffie-Hellman
            被用來做鑰匙協商(key agreement),具有保密(secrecy)功能,但是不具有加密(encryption)或者認證(authentication)功能,因此在進行協商前需用別的方式對另一方進行認證。
            首先,Diffie-Hellman創建一套雙方都認可的參數集,包括一個隨機的素數和生成因子(generator value,通常是2或者5)。基于這個參數集,雙方都計算出一個公鑰匙和私鑰匙,公鑰匙交給對方,對方的公鑰匙和自己的私鑰匙用來計算共享的鑰匙。
            OpenSSL 0.9.5 提供了dhparam命令用來生成參數集,但是生成公鑰匙和私鑰匙的命令dh和gendh已不推薦使用。未來版本可能會加上這個功能。

            #############################################################
            # Diffie-Hellman應用例子
            # 使用生成因子2和隨機的1024-bit的素數產生D0ffie-Hellman參數
            # 輸出保存到文件dhparam.pem
            $ openssl dhparam -out dhparam.pem -2 1024
            # 從dhparam.pem中讀取Diffie-Hell參數,以C代碼的形式
            # 輸出到stdout
            $ openssl dhparam -in dhparam.pem -noout -C

            4.2 數字簽名算法(Digital Signature Algorithm, DSA)
            主要用來做認證,不能用來加密(encryption)或者保密(secrecy),因此它通常和Diffie-Hellman配合使用。在進行鑰匙協商前先用DSA進行認證(authentication)。
            有三個命令可用來完成DSA算法提供的功能。
            dsaparam命令生成和檢查DSA參數,還可生成DSA私鑰匙。
            gendsa命令用來為一套DSA參數生成私鑰匙,這把私鑰匙可明文保存,也可指定加密選項加密保存。可采用DES,3DES,或者IDEA進行加密。
            dsa命令用來從DSA的私鑰匙中生成公鑰匙,還可以為私鑰匙加解密,或者改變私鑰匙加密的口令。

            #############################################################
            # DSA應用例子
            # 生成1024位DSA參數集,并輸出到文件dsaparam.pem
            $ openssl dsaparam -out dsaparam.pem 1024
            # 使用參數文件dsaparam.pem生成DSA私鑰匙,
            # 采用3DES加密后輸出到文件dsaprivatekey.pem
            $ openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem
            # 使用私鑰匙dsaprivatekey.pem生成公鑰匙,
            # 輸出到dsapublickey.pem
            $ openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem
            # 從dsaprivatekey.pem中讀取私鑰匙,解密并輸入新口令進行加密,
            # 然后寫回文件dsaprivatekey.pem
            $ openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin

            4.3 RSA
            RSA得名于它的三位創建者:Ron Rivest, Adi Shamir, Leonard Adleman。
            目前之所以如此流行,是因為它集保密、認證、加密的功能于一體。
            不像Diffie-Hellman和DSA,RSA算法不需要生成參數文件,這在很大程度上簡化了操作。
            有三個命令可用來完成RSA提供的功能。
            genrsa命令生成新的RSA私匙,推薦的私匙長度為1024位,不建議低于該值或者高于2048位。
            缺省情況下私匙不被加密,但是可用DES、3DES或者IDEA加密。
            rsa命令可用來添加、修改、刪除私匙的加密保護,也可用來從私匙中生成RSA公匙,或者用來顯示私匙或公匙信息。
            rsautl命令提供RSA加密和簽名功能。但是不推薦用它來加密大塊數據,或者給大塊數據簽名,因為這種算法的速度較來慢。通常用它給對稱密
            匙加密,然后通過enc命令用對稱密匙對大塊數據加密。

            #############################################################
            # RSA應用例子
            # 產生1024位RSA私匙,用3DES加密它,口令為trousers,
            # 輸出到文件rsaprivatekey.pem
            $ openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024
            # 從文件rsaprivatekey.pem讀取私匙,用口令trousers解密,
            # 生成的公鑰匙輸出到文件rsapublickey.pem
            $ openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem
            # 用公鑰匙rsapublickey.pem加密文件plain.txt,
            # 輸出到文件cipher.txt
            $ openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
            # 使用私鑰匙rsaprivatekey.pem解密密文cipher.txt,
            # 輸出到文件plain.txt
            $ openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt
            # 用私鑰匙rsaprivatekey.pem給文件plain.txt簽名,
            # 輸出到文件signature.bin
            $ openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
            # 用公鑰匙rsapublickey.pem驗證簽名signature.bin,
            # 輸出到文件plain.txt
            $ openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain

            (5) S/MIME[Secure Multipurpose Internet Mail Exchange]
            S/MIME應用于安全郵件交換,可用來認證和加密,是PGP的競爭對手。與PGP不同的是,它需要一套公匙體系建立信任關系,而PGP只需直接從某個地方獲取對方的公匙就可以。然而正因為這樣,它的擴展性比PGP要好。另一方面,S/MIME可以對多人群發安全消息,而PGP則不能。
            命令smime可用來加解密、簽名、驗證S/MIME v2消息(對S/MIME v3的支持有限而且很可能不工作)。對于沒有內置S/MIME支持的應用來說,可通過smime來處理進來(incoming)和出去(outgoing)的消息。

            #############################################################
            # RSA應用例子
            # 從X.509證書文件cert.pem中獲取公鑰匙,
            # 用3DES加密mail.txt
            # 輸出到文件mail.enc
            $ openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem
            # 從X.509證書文件cert.pem中獲取接收人的公鑰匙,
            # 用私鑰匙key.pem解密S/MIME消息mail.enc,
            # 結果輸出到文件mail.txt
            $ openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt
            # cert.pem為X.509證書文件,用私匙key,pem為mail.txt簽名,
            # 證書被包含在S/MIME消息中,輸出到文件mail.sgn
            $ openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn
            # 驗證S/MIME消息mail.sgn,輸出到文件mail.txt
            # 簽名者的證書應該作為S/MIME消息的一部分包含在mail.sgn中
            $ openssl smime -verify -in mail.sgn -out mail.txt

            (6) 口令和口令輸入(passphase)
            OpenSSL口令選項名稱不是很一致,通常為passin和passout。可以指定各種各樣的口令輸入來源,不同的來源所承擔的風險取決于你的接受能力。
            stdin
            這種方式不同于缺省方式,它允許重定向標準輸入,而缺省方式下是直接從真實的終端設備(TTY)讀入口令的。
            pass:
            直接在命令行指定口令為password。不推薦這樣使用。
            env:
            從環境變量中獲取口令,比pass方式安全了些,但是進程環境仍可能被別有用心的進程讀到。
            file:
            從文件中獲取,注意保護好文件的安全性。
            fd:
            從文件描述符中讀取。通常情況是父進程啟動OpenSSL命令行工具,由于OpenSSL繼承了父進程的文件描述符,因此可以從文件描述符中讀取口令。
            (7) 重置偽隨機數生成器(Seeding the Pseudorandom Number Generator)
            對于OpenSSL,正確地重置PRNG(Pseudo Random Number Generator)很重要。
            命令行工具會試圖重置PRNG,當然這不是萬無一失的。如果錯誤發生,命令行工具會生成一條警告,這意味著生成的隨機數是可預料的,這時就應該采用一種更可靠的重置機制而不能是默認的。
            在Windows系統,重置PRNG的來源很多,比如屏幕內容。在Unix系統,通常通過設備/dev/urandom來重置PRNG。從0.9.7開始,OpenSSL還試圖通過連接EGD套接字來重置PRNG。
            除了基本的重置來源,命令行工具還會查找包含隨機數據的文件。假如環境變量RANDFILE被設置,它的值就可以用來重置PRNG。如果沒有設置,則HOME目錄下的.rnd文件將會使用。
            OpenSSL還提供了一個命令rand用來指定重置來源文件。來源文件之間以操作系統的文件分割字符隔開。對于Unix系統,如果來源文件是EGD套接字,則會從EGD服務器獲取隨機數。
            EGD服務器是用Perl寫成的收集重置來源的daemon,可運行在裝了Perl的基于Unix的系統,見http://egd.sourceforge.net。如果沒有/dev/random或者/dev/urandom,EGD是一個不錯的候選。
            EGD不能運行在Windows系統中。對于Windows環境,推薦使用EGADS(Entropy Gathering And Distribution System)。它可運行在Unix和Windows系統中,見http://www.securesw.com/egads。
            (本文參考O’Reilly-Network Security with OpenSSL)




            附加測試實例:
            #############################################################
            # 消息摘要算法應用例子
            # 用SHA1算法計算文件file.txt的哈西值,輸出到stdout
            $ openssl dgst -sha1 file.txt
            [root@server02 ~]# echo zhaohang > file.txt
            [root@server02 ~]# openssl dgst -sha1 file.txt
            SHA1(file.txt)= cf017022db32f04cb57d2ec1ae6b39751a6155e4
            # 用SHA1算法計算文件file.txt的哈西值,輸出到文件digest.txt
            $ openssl sha1 -out digest.txt file.txt
            [root@server02 ~]# openssl sha1 -out digest.txt file.txt
            [root@server02 ~]# cat digest.txt
            SHA1(file.txt)= cf017022db32f04cb57d2ec1ae6b39751a6155e4
            # 用DSS1(SHA1)算法為文件file.txt簽名,輸出到文件dsasign.bin
            # 簽名的private key必須為DSA算法產生的,保存在文件dsakey.pem中
            $ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt
            # 用dss1算法驗證file.txt的數字簽名dsasign.bin,
            # 驗證的private key為DSA算法產生的文件dsakey.pem
            $ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
            # 用sha1算法為文件file.txt簽名,輸出到文件rsasign.bin
            # 簽名的private key為RSA算法產生的文件rsaprivate.pem
            $ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
            # 用sha1算法驗證file.txt的數字簽名rsasign.bin,
            # 驗證的public key為RSA算法生成的rsapublic.pem
            $ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt
            #############################################################
            #############################################################
            # 對稱加密應用例子
            # 用DES3算法的CBC模式加密文件 file.txt
            # 加密結果輸出到文件 ciphertext.bin
            $ openssl enc -des3 -salt -in file.txt -out ciphertext.bin -pass pass:123456
            # 用DES3算法的CBC模式解密文件 ciphertext.bin
            $ openssl enc -des3 -d -in ciphertext.bin -pass pass:123456
            # 用DES3算法的OFB模式解密文件ciphertext.bin:
            # 提供的口令為trousers,輸出到文件plaintext.doc
            # 注意:因為模式不同,該命令不能對以上的文件進行解密
            $ openssl enc -des-ede3-ofb -d -in ciphertext.bin -out file.txt -pass pass:123456
            # 用Blowfish的CFB模式加/解密 file.txt,口令從環境變量 HOSTNMAE 中取
            $ openssl bf-cfb -salt -in file.txt -out ciphertext.bin -pass env:HOSTNAME
            $ openssl bf-cfb -d -in ciphertext.bin -pass env:HOSTNAME
            #############################################################
            #############################################################
            # DSA應用例子 - 數字簽名算法
            # 給文件ciphertext.bin用base64編碼,輸出到文件base64.txt
            $ openssl base64 -in ciphertext.bin -out base64.txt
            # 使用參數文件dsaparam.pem生成DSA私鑰匙,
            # 采用3DES加密后輸出到文件dsaprivatekey.pem
            $ openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem
            # 使用私鑰匙dsaprivatekey.pem生成公鑰匙,
            # 輸出到dsapublickey.pem
            $ openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem
            # 從dsaprivatekey.pem中讀取私鑰匙,解密并輸入新口令進行加密,
            # 然后寫回文件dsaprivatekey.pem
            $ openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin
            #############################################################
            #############################################################
            # RSA應用例子
            # 產生1024位RSA私匙,用3DES加密它,口令為123456
            # 輸出到文件rsaprivatekey.pem
            $ openssl genrsa -out rsaprivatekey.pem -passout pass:123456 -des3 1024
            # 從文件rsaprivatekey.pem讀取私匙,用口令123456解密
            # 生成的公鑰匙輸出到文件rsapublickey.pem
            $ openssl rsa -in rsaprivatekey.pem -passin pass:123456 -pubout -out rsapubckey.pem
            # 用公鑰匙rsapublickey.pem加密文件 file.txt
            # 輸出到文件cipher.txt
            $ openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in file.txt -out cipher.txt
            # 使用私鑰匙rsaprivatekey.pem解密密文cipher.txt
            # 輸出到文件 file2.txt
            $ openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out file2.txt
            # 用私鑰匙rsaprivatekey.pem給文件file.txt簽名
            # 輸出到文件signature.bin
            $ openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
            # 用公鑰匙rsapublickey.pem驗證簽名signature.bin
            # 輸出到文件plain.txt
            $ openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out file.txt
            久久精品国产69国产精品亚洲| 国产精久久一区二区三区 | 久久精品国产91久久综合麻豆自制| 亚洲精品无码久久不卡| 热综合一本伊人久久精品| 久久综合九色综合久99| av午夜福利一片免费看久久 | 久久99精品免费一区二区| 欧美亚洲国产精品久久蜜芽| 久久99精品久久久久久| 久久免费线看线看| 99久久亚洲综合精品成人| 国产精品日韩欧美久久综合| 久久播电影网| 久久久久国产精品人妻| 欧洲成人午夜精品无码区久久| 99国产欧美久久久精品蜜芽| 狠狠色噜噜狠狠狠狠狠色综合久久 | 久久亚洲国产成人影院网站| 久久久久久一区国产精品| 中文字幕亚洲综合久久2| 久久久青草青青国产亚洲免观| 久久亚洲国产成人影院网站 | 一本色道久久88综合日韩精品| 欧美亚洲国产精品久久久久| 午夜天堂av天堂久久久| 99热成人精品热久久669| 久久午夜综合久久| 精品久久久久久中文字幕大豆网| 99久久婷婷国产综合亚洲| 久久影视国产亚洲| 久久er99热精品一区二区| 久久996热精品xxxx| 久久精品水蜜桃av综合天堂| 狠狠色综合久久久久尤物| 久久久精品国产免大香伊| 国产女人aaa级久久久级| 无码人妻精品一区二区三区久久久| 国产精品美女久久久免费| 久久综合国产乱子伦精品免费| 亚洲第一永久AV网站久久精品男人的天堂AV|