密鑰相關(guān)命令

環(huán)境準(zhǔn)備:下載安裝Win64OpenSSL-1_1_0i.exe和jdk_1.8

一、生成.ssh文件(用于遠(yuǎn)程登陸)

生成 id_rsa 和 id_rsa.pub 文件

ssh-keygen [-q] [-b bits] [-C comment] [-f output_keyfile] [-m format]  [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa] [-N new_passphrase] [-O option] [-w provider]

可以簡單生成一個(gè)2048位的密鑰對

ssh-keygen -t rsa -b 2048 -m PEM -C "message"

將公鑰發(fā)送到目標(biāo)主機(jī)

ssh-copy-id [ip]

如果修改了22端口為14000,那么可以使用命令ssh-copy-id -i id_rsa.pub "-p14000" root@home.jianghuan.top
執(zhí)行成功之后,我們在目標(biāo)機(jī)器上查看/root/.ssh目錄已經(jīng)生成,并且多了一個(gè)名為authorized_keys的文件,里面保存的正是原機(jī)器上ssh-keygen生成的id_rsa.pub的內(nèi)容。

  • id_rsa:私鑰
  • id_rsa.pub:公鑰
  • authorized_keys:存儲了可以遠(yuǎn)程登陸本機(jī)的節(jié)點(diǎn)的公鑰
  • known_hosts:連接到本機(jī)的節(jié)點(diǎn)的信息,包括遠(yuǎn)程機(jī)器ip、遠(yuǎn)程機(jī)器公鑰。

ssh 遠(yuǎn)程密鑰登陸命令是:ssh -i /path/to/private/key username@remote_host


二、openssl的證書指令

2.1 基本命令

生成私鑰

openssl genrsa -aes256 -out rsaprivatekey.pem 2048
  • 生成rsa私鑰,aes256算法,2048位強(qiáng)度,密鑰文件為server.key。

生成公鑰

openssl rsa -in rsaprivatekey.pem -out rsapublickey.pem -pubout

將私鑰進(jìn)行pkcs8編碼給java用

openssl pkcs8 -topk8 -inform PEM -in rsaprivatekey.pem -outform PEM -out rsaprivatekey_pkcs8.pem -nocrypt

2.2 生成證書

2.2.1 創(chuàng)建自簽名證書

  1. 生成私鑰

    openssl genrsa -aes256 -out server.key 2048
    
  2. 生成CSR(證書簽名請求)
    Csr是證書請求文件,用于申請證書。

    openssl req -new -key server.key -out server.csr
    

    如果要支持https,Common Name應(yīng)該與域名保持一致,否則會引起瀏覽器警告。

  3. 刪除私鑰中的密碼
    在第1步創(chuàng)建私鑰的過程中,由于必須要指定一個(gè)密碼。而這個(gè)密碼會帶來一個(gè)副作用,那就是在每次啟動Web服務(wù)器時(shí),都會要求輸入密碼,這顯然非常不方便。
    要刪除私鑰中的密碼,操作如下:

    openssl rsa -in server.key -out server.key
    
  4. 生成自簽名證書CRT
    crt是CA認(rèn)證后的證書。用私鑰server.key給csr簽名后得到crt證書。

    openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
    

2.2.2 私有CA簽名證書(推薦)

  1. 創(chuàng)建root CA私鑰

    openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
    

    CN輸入ca.rancher.com

  2. 為服務(wù)端生成證書簽名請求文件

    openssl req -newkey rsa:4096 -nodes -sha256 -keyout demo.rancher.com.key -out  demo.rancher.com.csr
    

    CN輸入demo.rancher.com;

    注意:Commone Name一定要是你要授予證書的FQDN域名或主機(jī)名,并且不能與生成root CA設(shè)置的Commone Name相同

  3. 用第一步創(chuàng)建的CA證書給第二步生成的簽名請求進(jìn)行簽名

    openssl x509 -req -days 365 -in demo.rancher.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out demo.rancher.com.crt
    

4.如果您使用IP,例如192.168.1.101來連接,則可以改為運(yùn)行以下命令:

echo 'subjectAltName = IP:192.168.1.101' > extfile.cnf
openssl x509 -req -days 365 -in demo.rancher.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out  demo.rancher.com.crt

2.3 驗(yàn)證證書

注意: 因?yàn)槭褂玫氖亲院灻C書,瀏覽器會提示證書的頒發(fā)機(jī)構(gòu)是未知的。
把生成的ca證書和去除密碼的私鑰文件部署到web服務(wù)器后,執(zhí)行以下命令驗(yàn)證:

openssl s_client -connect demo.rancher.com:443 -servername demo.rancher.com -CAfile server-ca.crt


三、java庫的證書指令指令

3.1 基礎(chǔ)命令

3.1.1 增

使用JDK自帶工具keytool生成keystore和自簽名證書

keytool -genkeypair -keystore ./keystore  -storepass hxrhxr123 -alias hxr -keypass hxrhxr123 -keyalg RSA -keysize 1024 -validity 365
  • -keystore:秘鑰庫文件名,保存了生成的證書
  • -storepass:秘鑰庫的訪問密碼
  • -alias:秘鑰別名,默認(rèn) "mykey"
  • -keypass:秘鑰的訪問密碼
  • -keyalg:使用的hash算法,默認(rèn)"DSA"
  • -keysize:密鑰長度,默認(rèn)1024
  • -validity:有效期,默認(rèn)365天

創(chuàng)建新的密鑰

keytool -genkeypair -alias jetty2 -keypass bigdata123 -keyalg RSA -keysize 1024 -validity 365 -dname "CN=www.chenjie.asia,OU=,L=,ST=,C=" -keystore ./keystore -storepass hxrhxr123
  • -dname:指定證書擁有者信息 "CN=名字與姓氏,OU=組織單位名稱,O=組織名稱,L=城市或區(qū)域名稱,ST=州或省份名稱,C=單位的兩字母國家代碼"

導(dǎo)入證書文件到密鑰庫中

keytool -import -alias jetty3 -file ./test.cer -keystore ./keystore -storepass hxrhxr123

導(dǎo)出密鑰庫中的證書密鑰

keytool -export  [-rfc] -file ./jwt.crt -keystore ./keystore -storepass hxrhxr123 -alias jetty -keypass hxrhxr123

查看導(dǎo)出的crt證書信息

keytool -printcert -file "test.crt"

3.1.2 查

查看密鑰庫中所有密鑰

keytool -list [-v] -keystore jwtstore -storepass hxrhxr123
  • -v:打印所有密鑰的詳細(xì)信息

查看別名是hxr 的證書信息

keytool -list [-v] [-rfc] -alias hxr -keystore jwtstore -storepass hxrhxr123

指定了 -v 選項(xiàng),將以可讀格式打印證書,如果指定了 -rfc 選項(xiàng),將以可打印的編碼格式輸出證書。

openssl查看公鑰

keytool -list -rfc --keystore uaacenter.jks | openssl x509 -inform pem -pubkey

3.1.3 改

修改密鑰庫密碼

keytool -keypasswd -new test1 -keystore ./keystore -storepass hxrhxr123

修改秘鑰庫中秘鑰的密碼

keytool -keypasswd -new testtest1 -keystore jwtstore -storepass hxrhxr123 -alias hxr -keypass hxrhxr123 

修改密鑰庫中密鑰的信息

keytool -selfcert -dname "cn=chenjie.asia,ou=,o=,c=" -keystore ./keystore -storepass hxrhxr123  -alias jetty -keypass hxrhxr123

3.1.4 刪

刪除別名是hxr的證書信息

keytool -delete -alias hxr -keystore jwtstore -storepass hxrhxr123

3.1.5 jar包簽名

對InetAddress-1.0-SNAPSHOT.jar包進(jìn)行簽名

jarsigner -verbose -signedjar ./InetAddress-1.0-SNAPSHOT.jar.signed -keystore ./keystore -storepass hxrhxr123 -keypass bigdata123 ./InetAddress-1.0-SNAPSHOT.jar jetty
  • -verbose 打印詳細(xì)信息
  • -signedjar 簽名后文件存放的路徑

對簽名后的文件進(jìn)行驗(yàn)證

jarsigner -verbose -verify InetAddress-1.0-SNAPSHOT.jar.signed

如果jar包中的文件被篡改,則驗(yàn)證不通過。
如我們修改了jar包中的pom.xml文件的內(nèi)容,再進(jìn)行驗(yàn)證,報(bào)錯如下

D:\>jarsigner -verify InetAddress-1.0-SNAPSHOT.jar
jarsigner: java.lang.SecurityException: SHA-256 digest error for META-INF/maven/org.example/InetAddress/pom.xml


3.2 使自簽名證書受信任

3.2.1 將證書導(dǎo)出

keytool -export -rfc -file ./hxr.cer -alias jetty -keystore ./keystore -storepass hxrhxr123 

3.2.2 使客戶端信任服務(wù)器

  1. 使chrome瀏覽器信任
    進(jìn)入瀏覽器的【設(shè)置】-【隱私設(shè)置和安全性】-【安全】-【管理證書】中,添加證書到 "受信任的根證書頒發(fā)機(jī)構(gòu)"即可。
    也可以直接雙擊證書安裝到電腦中。
    重啟瀏覽器,再次訪問網(wǎng)頁發(fā)現(xiàn)證書已被信任。

可是還是不被信任 NET::ERR_CERT_COMMON_NAME_INVALID???奇怪!!!

  1. 使centos7.x服務(wù)器信任
    將導(dǎo)出的證書內(nèi)容追加到/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem文件中
cat /etc/security/keytab/cos-bigdata-test-hadoop-01.cer >> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem

再次請求就不會報(bào)證書不受信任。

  1. 使jdk信任證書
    將證書添加到j(luò)dk的信任庫中,jdk的信任庫文件是cacerts。
    keytool -import -v -trustcacerts -alias cos-bigdata-test-hadoop-01 -file /etc/security/keytab/cos-bigdata-test-hadoop-01.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
    
    這種情況的使用場景就是,有框架是java編寫的程序,在框架中請求一個(gè)自簽名證書配置的https服務(wù),如果不配置證書信任就會導(dǎo)致請求失敗。如hadoop框架中,如果配置了Https-only且證書是自簽名證書,那么默認(rèn)每分鐘Secondarynamenode會發(fā)起fetchImage的https請求,如果不配置自簽名證書可信任,就會導(dǎo)致請求失敗,Secondarynamenode功能失效。



keytool和openssl的區(qū)別:keytool沒辦法簽發(fā)證書,而openssl能夠進(jìn)行簽發(fā)和證書鏈的管理。
因此,keytool 簽發(fā)的所謂證書只是一種自簽名證書。所謂自簽名就是指證書只能保證自己是完整的,沒有經(jīng)過非法修改的。但是無法保證這個(gè)證書是屬于誰的。

自簽名證書有個(gè)很麻煩地方:對于每一個(gè)要鏈接的服務(wù)器,都要保存一個(gè)證書的驗(yàn)證副本。而且一旦服務(wù)器更換證書,所有客戶端就需要重新部署這些副本。
也就是說,你可以用自簽名證書讓承認(rèn)你的人承認(rèn)你。但如果你做了一丁點(diǎn)變化,你需要讓所有之前承認(rèn)你的人再次承認(rèn)你。

對于比較大型的應(yīng)用來說,這一點(diǎn)是不可接受的。所以就需要證書鏈進(jìn)行 雙向認(rèn)證。而 證書鏈,keytool自己就沒辦法做了,需要用到 openssl.


四、通過代碼獲取秘鑰庫的公私鑰并對jwt進(jìn)行簽名和驗(yàn)簽

public class KeyPairTest {

    @Test
    public void testCreateToken(){
        String location = "uaacenter.jks";
        String storepass = "uaacenter";
        String keypass = "uaacenter";
        String alias = "uaacenter";
        //加載證書
        ClassPathResource resource = new ClassPathResource(location);
        //讀取證書
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,storepass.toCharArray());
        //獲取證書中的一對秘鑰
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypass.toCharArray());
        //獲取私鑰
        RSAPrivateKey aPrivate = (RSAPrivateKey)keyPair.getPrivate();

        System.out.println(Base64.encode(aPrivate.getEncoded()));

        //創(chuàng)建令牌,需要私鑰加鹽[RSA算法]
        Jwt jwt = JwtHelper.encode("abcdefg", new RsaSigner(aPrivate));
        //將令牌用base64編碼得到token
        String token = jwt.getEncoded();

        System.out.println(token);
    }

    @Test
    public void testParseToken(){
        //TODO 獲取公鑰方式一:通過代碼從證書庫獲得公鑰
        String location = "uaacenter.jks";
        String storepass = "uaacenter";
        String keypass = "uaacenter";
        String alias = "uaacenter";
        //加載證書
        ClassPathResource resource = new ClassPathResource(location);
        //讀取證書
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,storepass.toCharArray());
        //獲取證書中的一對秘鑰
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypass.toCharArray());
        //獲取公鑰
        RSAPublicKey aPublic = (RSAPublicKey)keyPair.getPublic();

        System.out.println(Base64.encode(aPublic.getEncoded()));

        //TODO 獲取公鑰方式二:通過openssl指令獲取公鑰
        //需要帶上begin和end信息,并且去掉換行符
//        String aPublic= "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo668mNH7H86PzBCHsMsm7/Hxg4tK6YVWBWt74faDVrew6AzHfXz1S74ZoG5ftWt7hsQh2cFzpbnuMIYrhZatTEhnYNJA6T47meSb476WSc70/59w+21EIeQTbWUNhBZeA9r/M2u5ItBBJksyWSmMM6c2YRCeF7HC/KHFFGhWc46y9x6r3iqOrwnCAsrSjz9cIEvlCVgewLMxU5x9H/INZoqH3ZR8jUv/fIxFfju11izUrpxTb16SYC/t46Lb5l0Kynmrv4OOolGk0yJgeH3vgDnS/3OhlD08vGujnI6os7acCcXwEq3SDHvtOfd/Q/CBbUcDSQuk9ecyvtgFVRvOEwIDAQAB-----END PUBLIC KEY-----";

        //解析之前得到的token
        String token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.YWJjZGVmZw.n1xeWFHjmh634MBzmC5aY9Q0Jo_EKRPPfjNf9eT6dguv3ivBHkBrFCVrVDMsM-f4Gy7ObrSCt-aR18tWySfmHgv9zp30YeXYbCg2sV_-pCPLJVE8wYuFYuuqnXINYNudAhp2rfhPApjh-jJxjVIdUB9NyMlWamAF7y-y3r2ox_32y0vqGQtNc6M6d9JR_MifVQWink8rGvhs-FVJlwDbhMt88kxsB9dOWhTspeQk9exfJIV_hDFhYiXLdQapG4t6FscEDeZjCRsuTfadj5KaJ3QwiWa711pZF50MBozCtE2NLSR_2UHtt_rmCMQcqDI3FphOHXN3GjadJn_gnfjpoQ";
        //解碼后獲得jwt并通過公鑰驗(yàn)證是否有效
        Jwt jwt = JwtHelper.decodeAndVerify(token, new RsaVerifier(aPublic));
        String claims = jwt.getClaims();

        System.out.println(claims);
    }

}

打印的privateKey為

MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCjrryY0fsfzo/MEIewyybv8fGDi0rphVYFa3vh9oNWt7DoDMd9fPVLvhmgbl+1a3uGxCHZwXOlue4whiuFlq1MSGdg0kDpPjuZ5JvjvpZJzvT/n3D7bUQh5BNtZQ2EFl4D2v8za7ki0EEmSzJZKYwzpzZhEJ4XscL8ocUUaFZzjrL3HqveKo6vCcICytKPP1wgS+UJWB7AszFTnH0f8g1miofdlHyNS/98jEV+O7XWLNSunFNvXpJgL+3jotvmXQrKeau/g46iUaTTImB4fe+AOdL/c6GUPTy8a6OcjqiztpwJxfASrdIMe+05939D8IFtRwNJC6T15zK+2AVVG84TAgMBAAECggEAN/2DwfrCHkU4ZyOYZt93OEjYxpiVTYAwxrXXsJn0n2tCdn44lzJxbjFe7sQStSpJHPZmZeiIuL37PloG9TFvolJ6GmKRlbeWB7RtpuAA5MqIgBB4Q2lDDxzHkHoqv24vRr5Y4awNrlzyjDjYxisyLFEchuN6ULyb6HMlyS9Ps0Mm2KyqmTErgMdedDveWQXl/76xlKEWRDvx8xXmH/ThrOrWhFT9TXGAshL1/ifyW+eeB/xEI2WhrqYRD/nLCl4wMQ2ZiJ0bdDDcDhhyzX6GGjJ0T9scQVDh1TEqdjRwQwP22xXPPwUPoeVQw23/7eaKpCDzlJPxn2+ZdMqxRjGPoQKBgQDSNteMuvLccJaOCYaJYMUc5pTknEzkxCYI1u8/AwoGgDqA5WtJmBHOOqVYfvgH9tzLD7K4dkNWTrvXOR3uh2IQgkqt9kjBv5V0JUWBjQMkY9Z0Boefh/wZCpKdIbNmymHWgagT096/yD4rpryQ8kQo3Bk6/XXALxJkBsVMhfVzyQKBgQDHVWAAWj0llJaFQvDlEab0IrVRvWISe7FJejBkWMFddgInRd039GVbK+OukOKbw0orMsR30/kfvrBFpR6ZDGGb2ivmwxoAyI7rvaN9TrjOKb4UsnKv5FG66NUIUG8/XBfuN+wLjs9E+wg26Y1XMiZ7TBidOgcmICPL83mh+60I+wKBgQDRZKGHZD1AScIeT+y8cTFHXYPYyLxrb9s3GOoNyTg2S4p7FIuvLhQmahKDuU3VmRhMCSIMTnk6woinlRR0olSTf0VmTZohrHXx0KKQrmb/25cl0c9MoMcEJpzuekBa1qNoaZSD05rhTFRpZNgWRcyRKtTTBuBBBGJ8UqY7WICryQKBgFXq3q5INwLzwM0/xUV3Dlc8fpr03kjJN+lL2X/nIbF/I/55hpiPpwBdMo4TtRkeW+GyyCw+GastLh1WxpGBXLEooLOedJ7R04iY/NcOD2oNY/jX0ccuymud3/TtdoYA0+/B+uQgcgZxjWDd2iYzX5LVgeaDFIHCaKuIDm1bZYHxAoGBAI1tVE6ZqgIXuRMRCTRXxYgfASMuVqGOJ1IokYrC7aCq1G2VvFz8SLxYKIUUNOOaAj7aazZ6Nu6m97aECOdkQO/ATt3ha4r/GrieEUK801BbgWvTvb668WKLRgJoo9cLbDS5ZxRN1o11FNuivWzah0ih+C+3iALwO6d/HMYMKEu+

打印的publicKey如下,通過java代碼獲得的publicKey和openssl獲得的publicKey是一致的。需要注意的是直接使用公鑰字符串需要帶上begin和end前后綴。

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo668mNH7H86PzBCHsMsm7/Hxg4tK6YVWBWt74faDVrew6AzHfXz1S74ZoG5ftWt7hsQh2cFzpbnuMIYrhZatTEhnYNJA6T47meSb476WSc70/59w+21EIeQTbWUNhBZeA9r/M2u5ItBBJksyWSmMM6c2YRCeF7HC/KHFFGhWc46y9x6r3iqOrwnCAsrSjz9cIEvlCVgewLMxU5x9H/INZoqH3ZR8jUv/fIxFfju11izUrpxTb16SYC/t46Lb5l0Kynmrv4OOolGk0yJgeH3vgDnS/3OhlD08vGujnI6os7acCcXwEq3SDHvtOfd/Q/CBbUcDSQuk9ecyvtgFVRvOEwIDAQAB


public class ExportCert {

    //導(dǎo)出證書 base64格式
    public static void exportCert(KeyStore keyStore, String alias, String exportFile) throws Exception {
        Certificate certificate = keyStore.getCertificate(alias);
        BASE64Encoder encoder = new BASE64Encoder();
        String encoded = encoder.encode(certificate.getEncoded());
        FileWriter fw = new FileWriter(exportFile);
        fw.write("------Begin Certificate----- \r\n ");//非必須
        fw.write(encoded);
        fw.write("\r\n-----End Certificate-----");//非必須
        fw.close();
    }

    //得到KeyPair
    public static KeyPair getKeyPair(KeyStore keyStore, String alias, char[] password){
        try{
            Key key = keyStore.getKey(alias, password);
            if (key instanceof PrivateKey){
                Certificate certificate = keyStore.getCertificate(alias);
                PublicKey publicKey = certificate.getPublicKey();
                return new KeyPair(publicKey, (PrivateKey) key);
            }
        }catch (UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException e){
            e.printStackTrace();
        }
        return null;
    }

    //導(dǎo)出私鑰
    public static void exportPrivateKey(PrivateKey privateKey, String exportFile) throws Exception {
        BASE64Encoder encoder = new BASE64Encoder();
        String encoded = encoder.encode(privateKey.getEncoded());
        FileWriter fileWriter = new FileWriter(exportFile);
        fileWriter.write("-----Begin Private Key-----\r\n");//非必須
        fileWriter.write(encoded);
        fileWriter.write("\r\n-----End Private Key-----");//非必須
        fileWriter.close();
    }

    //導(dǎo)出公鑰
    public static void exportPublicKey(PublicKey publicKey, String exportFile) throws Exception {
        BASE64Encoder encoder = new BASE64Encoder();
        String encoded = encoder.encode(publicKey.getEncoded());
        FileWriter fileWriter = new FileWriter(exportFile);
        fileWriter.write("-----Begin Public Key-----\r\n");//非必須
        fileWriter.write(encoded);
        fileWriter.write("\r\n-----End Public Key-----");//非必須
        fileWriter.close();
    }

    public static void main(String[] args) throws Exception{
        String keyStoreType = "jks";
        String keystoreFile = "D:\\project\\workspace\\HelloWorld\\out\\production\\HelloWorld\\kunpu\\ijvmkeys";
        String password = "ijvm2ed"; //keystore的解析密碼
        String friendPassword = "friend4life";//條目的解析密碼

        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(new FileInputStream(keystoreFile), password.toCharArray());

        String alias = "friend";//條目別名
        String exportCertFile = "D:\\project\\workspace\\HelloWorld\\out\\production\\HelloWorld\\kunpu\\cert.txt";
        String exportPrivateFile = "D:\\project\\workspace\\HelloWorld\\out\\production\\HelloWorld\\kunpu\\privateKey.txt";
        String exportPublicFile = "D:\\project\\workspace\\HelloWorld\\out\\production\\HelloWorld\\kunpu\\publicKey.txt";

        ExportCert.exportCert(keyStore, alias, exportCertFile);
        KeyPair keyPair = ExportCert.getKeyPair(keyStore, alias, friendPassword.toCharArray()); //注意這里的密碼是你的別名對應(yīng)的密碼,不指定的話就是你的keystore的解析密碼
        ExportCert.exportPrivateKey(keyPair.getPrivate(), exportPrivateFile);
        ExportCert.exportPublicKey(keyPair.getPublic(), exportPublicFile);

        System.out.println("OK");

    }


}

將公鑰字符串轉(zhuǎn)化為PublicKey對象等方法

/**
 * RSA加解密工具類
 */
public class RSAUtils {
    //公鑰加密
    public static String encrypt(String content, PublicKey publicKey) {
        try{
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//java默認(rèn)"RSA"="RSA/ECB/PKCS1Padding"
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] output = cipher.doFinal(content.getBytes());
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(output);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
 
    //公鑰加密
    public static byte[] encrypt(byte[] content, PublicKey publicKey) {
        try{
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//java默認(rèn)"RSA"="RSA/ECB/PKCS1Padding"
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            return  cipher.doFinal(content);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
 
    //私鑰解密
    public static byte[] decrypt(byte[] content, PrivateKey privateKey) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return cipher.doFinal(content);
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
    //私鑰解密
    public static String decrypt(String content, PrivateKey privateKey) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte [] b = cipher.doFinal(content.getBytes());
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(b);
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
 
    /**
     * String轉(zhuǎn)公鑰PublicKey
     * @param key
     * @return
     * @throws Exception
     */
    public static PublicKey getPublicKey(String key) throws Exception {
        byte[] keyBytes;
        keyBytes = (new BASE64Decoder()).decodeBuffer(key);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }
 
    /**
     * String轉(zhuǎn)私鑰PrivateKey
     * @param key
     * @return
     * @throws Exception
     */
    public static PrivateKey getPrivateKey(String key) throws Exception {
        byte[] keyBytes;
        keyBytes = (new BASE64Decoder()).decodeBuffer(key);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        return privateKey;
    }
}










<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="REFRESH" content="0;url=dfshealth.html" />
<title>Hadoop Administration</title>
</head>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,258評論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內(nèi)容