前言
團隊的專案近期更換到GitLab託管了,驗證方式也從以前的HTTPS+SSH變成了純SSH,所以就需要配置SSH Key。
SSH的加密使用的RSA演算法,文章末尾將給出一個簡單的加密解密演示。
一、生成公鑰私鑰對
先看看無Key連線遠端倉庫會出現什麼情況:
git fetch --all
正在獲取 origin
The authenticity of host '[gitlab.xxx.com]:2208 ([123.234.123.234]:1234)' can't be established.
ED25519 key fingerprint is SHA256:oDUUd81eFr9WsLsNvx9fEHxb1bS71o.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[gitlab.xxx.com]:1234' (ED25519) to the list of known hosts.
git@gitlab.xxx.com's password:
Permission denied, please try again.
git@gitlab.xxx.com's password:
- 首先提示金鑰沒有驗證過,是否繼續
- 選擇繼續後會提示輸入git的密碼
- 我們沒有git的密碼
所以,是沒有辦法正常拉取的。
為什麼會提示git賬戶呢?我猜是Url裡寫的是git@gitlab.xxx.com
也就是使用者名稱艾特主機名,所以終端把git作為賬戶處理了,才會讓我們輸入git的密碼。
正確的開啟方式來了:
在Linux/Mac終端或Windows的GitBash輸入:
// 生成公鑰私鑰對
ssh-keygen -t rsa -C '郵箱'
// 示例,提示資訊可以全部預設回車
ssh-keygen -t rsa -C '123.abc'
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/lyx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/lyx/.ssh/id_rsa
Your public key has been saved in /Users/lyx/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:eYm9YeewQwsUO/Ai5zgDb+tKNJZ7dEM 123@abc.com
The key's randomart image is:
+---[RSA 3072]----+
| o. . |
|+..o . |
|+*oooEo |
|Bo= o= . + . |
|=X o.o. S O . |
|*oO . . = O |
| = + = . |
|. o . |
|.o. |
+----[SHA256]-----+
一路操作之後會在使用者目錄~/.ssh/下生成兩個檔案:
其中,左邊的是私鑰,留在自己電腦上用於身份驗證。
右邊的是公鑰,需要上傳到GitLab。
開啟id_rsa.pub檔案,全選複製:
在GitLab上找到SSH Keys頁面,貼上,會自動生成標題:
新增後下面就會顯示已有的SSH Key了:
對於Github的操作方式類似:
再來拉取一次就成功了:
至此操作部分已完成。
二、RSA加密演示
之前老師演示過現場生成金鑰對加密解密,但由於時間原因沒有演示完,這次本文來複現一下加密過程。
RSA是一種非對稱加密。
一般的加密方式稱為對稱加密,加密金鑰和解密金鑰一樣,缺點在於一旦金鑰洩露,密文就不安全了。
而對稱加密指的是加密金鑰和解密金鑰不一樣(公鑰和私鑰),公鑰加密後只能用私鑰解密。
接下來我們用一個線上生成網站演示一下,類似網站很多,例如:
http://www.metools.info/code/...
首先點選按鈕,生成一對公鑰私鑰。為了方便讀者跟著文章操作,我把金鑰和密文都粘在了文章中。
複製一下金鑰對:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtuOVdG/jlSaQuzJvFlS0
EXRD4V8OnG1GaYwxnKj7gRizgmf5GBRxQgSRj+pTkj6VsEacGbGvi0T6gDcamJJJ
H2dEgJK+J3xDhjgetiA+RZjQ6sBlAE5f2NcdtYlckzl1K5K9aZXxlFHkQAqquwyI
NJtlupDEfbmVS7Zk2YUo4F2qxfLcKtHLpQJOMCZSXNPrX7Nv5cdXkbju0QKLNqr1
ymj8gLjhNyi2duAYBqAaDFuiklscPqeG/vZRKBbEezdZVZsqEynfedz440YRB3qW
N2kRfu+mtclRftbkv2FVrYCKw4SZ+coz4XVgKiCI/t33mFPDpgdroHaNdOERWwKf
jQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC245V0b+OVJpC7
Mm8WVLQRdEPhXw6cbUZpjDGcqPuBGLOCZ/kYFHFCBJGP6lOSPpWwRpwZsa+LRPqA
NxqYkkkfZ0SAkr4nfEOGOB62ID5FmNDqwGUATl/Y1x21iVyTOXUrkr1plfGUUeRA
Cqq7DIg0m2W6kMR9uZVLtmTZhSjgXarF8twq0culAk4wJlJc0+tfs2/lx1eRuO7R
Aos2qvXKaPyAuOE3KLZ24BgGoBoMW6KSWxw+p4b+9lEoFsR7N1lVmyoTKd953Pjj
RhEHepY3aRF+76a1yVF+1uS/YVWtgIrDhJn5yjPhdWAqIIj+3feYU8OmB2ugdo10
4RFbAp+NAgMBAAECggEAbIhqbQrpV93nDfBEFFB3+9OvZNNwbEw8+O4Fkx6FAnuS
K9Vf8XZQMAleCLXamnMhidadVHIp5tAsiGIrGlfVpRk3gcWTqwMHX2N2dkZ0LgEe
GfHK/n+ESb5/FvhJQ+VZL16JoVsmXgqrFYY/A3nQase9exXmRWYYvzGib6OiOmLa
0InXQDhkKHmBHkyIClrMuCsCgg+4R1Jwowc4bSTyfSgZpXj3Q63drFGuQFR+dywj
cPs55jhJ7b37Utsk1YLXB4rj9gHECQlWVLuYXcOn4QPJ2Y0Su9LzhleaRmywxDJ1
lsMsy9AYsSQkFy9FIRzqRIy4yQ/cAzF7z2z78o950QKBgQDdJHibVm+PGT0hyVts
fE+0LvUGrEaCpC1xlWs0APQCGt5dtcTiV2XT8s+wKie8jmRn5NrYUydGcVVvQ98b
e2pTO964ahsGdGJ277g7oE6MQTkXDY9dB7DryMaa224u1idYofmBUvwOtloeaqo4
hegQaNza9ziKWSYgs56dOavV8wKBgQDTt4LJC0GjaLBIp3kND/gzzPvYlzHUELqy
q/B4EQCma+/kB08d1UZWlmS/eNJrXqtbc0uxaf+83e732DippzRxHRE6SK5qk+lA
vxEoMyUn+QHAYL46nSDM9124F3TvLNhGlLPo3trA7KyWKgVpgli/VumXNUtHao8s
lZmv0mGUfwKBgQC5HyTPdMYi1o/0Tql34YCfZ4e6tFC6YFGieeCqQfoCIRfw/o74
ow0dJnByGnf1QoYO6ufAm6uPLqTEZd7JFMFnOAE0A67n8lnTEs35LDNU+eyevb07
tYqHdyW60OIl1yRM8Br8Bcn3TvOV7tjcREyGICJyMu5j8kkWqwamu3Z7vQKBgDW9
P+I+DDQpL43RjKVnJ04muspYXlqAwJL3l7syPaMAhMyxmkBtUURLOllrlqWQSxiU
ZGMtD6/l+XFJneBaQ7JueV/88OC2mJ9JoFY+3TCPQQWOyNph5eCA7XX75j+Ld346
4ou6fXY43PnkwqjsYBB5RCOQcII5JwxfELqTQReLAoGABoVxBx6i/6oFTO+zi8AM
Th98KVLTTXTMAuo2q58fArLpBXG8d0ahgnhS9vbzTp74saF5LO5GvWUuqZN5+1S3
6jJdeApldmhDqfaLzt9SRDyD6S2TgOc1TWRcIMHGUOkRkphuKvWlctn2LQXWyBTM
siDMrbdzCev5n3RqcekeTgk=
-----END PRIVATE KEY-----
接下來假設,我們要完成一項加密業務,於是就把私鑰放在了自己手中,而公鑰交給了客戶。
如果我們想給客戶傳送資料,就填入私鑰和明文,將會生成密文:
私鑰生成的密文:
Y1+RA9BUWG3I6UasSsofTgkNzT7hixSWboatYrOQd5lyGv5hxrFHOSe44fi1FAplv3wwoW13Sz4gQilwCPmt3yO/uhPvAnfnQ8dG6wkUK3bhG3wN7xsV+zaXizYCTLVd09s1edjhnlC7bCK2iffG5hVkQkqr5yfCJSDKxju5CZmXgGdz8q5RZy2z0nMQX8OMF5Ku3vOraF95iuE0x1BS900WN3Dpw4gEEkF9Y1EdV8GBl3F1q86o289PYlFAHAzLOPIP7MbqGizT+JOozQfMz5XRNj/7swEqvNGnsGgTUZ4Lz/3bDkrf6PtrecNBDN3bmNLbqOakweFJiovZkojE7Q==
我們把這段密文貼上到解密框,但金鑰使用私鑰,看看會發生什麼:
答案是解密失敗。
換成公鑰解密呢?
就成功了。
我們反向操作一下,用公鑰來加密資料,用私鑰解密:
公鑰加密的密文:
Yrazx/V6qgcWX25SY9h6jL4CptJkgtwbwZAcYkAfVJUYNpP+OhR2tW2yp63LXGhn9bby3ly7FAPmzz4oTsh/IUOvcNt/PCbGIRNti1WowmsARX3Yjvctd8DnSGaTX/DMcjjZIiLqsmvW90DmKOT3xWa0cinjceO2qLbBdcsVc19N2/Mchy4vy4RvuVmve5Um9IQfE6RjFz75uI+kM1T/r6BMoLq2uIdM6jVLmbidCgBBYa0nFLGfa3y2Q4bYMu+ixK0C8AEA7jWw6vli3mFbka0DD7U9+CfNN3LFV8PHaaKiPcN2j6rvg/jLMzi2reAyzWxcy5R+LgjTsFvOsXbLnA==
同樣可以解密成功。
三、總結
- 公鑰加密的資料只能私鑰解密
- 私鑰加密的資料只能公鑰解密
在一般的RSA應用場景中,公鑰一般會複製多份,分發給不同客戶,而私鑰留在自己手中,多個公鑰客戶都會向私鑰擁有者傳送資料。這種情況下,網路中只會傳輸公鑰加密的資料。
因此,公鑰擁有者彼此之間不知道對方傳送了什麼資料,保證了隱私性。
此外,一旦公鑰洩露,洩露的公鑰也不能解密網路上傳播的資料,不會影響密文的安全性。
參考資料:
線上金鑰生成工具:http://www.metools.info/code/...
知乎RSA演算法原理(需要高等數學基礎):https://zhuanlan.zhihu.com/p/...