1. 程式人生 > >Azure PaaS服務密鑰的安全性

Azure PaaS服務密鑰的安全性

edi 服務端 生成 代碼 from 連接 免密鑰 wid azure

Azure PaaS服務,比如存儲,Redis緩存,服務總線,IoT中心等等,一般通過密鑰來認證客戶端,也就是說只有提供正確密鑰的客戶端才能訪問和使用對應的Azure PaaS服務,所以這個密鑰是很重要很重要的,那麽該如何來保證密鑰的安全性呢?接下來將以問答的形式來闡述。

問:密鑰能否被暴力破解?

答:我們先看看幾個密鑰的例子來分析密鑰的組成。

存儲賬戶

5+kWqp1jIGQdGPVp6o7pgT/8DlRYnE55jJbxh51h7WHU4yGqAbMYdCYbSfR2CaFsi1/pfmL+d/QJbeAmDn6FQg==

Redis

R4W4Ol+yHUJ9Z25VHSrQdn9sGw9ApNe00EvpvVXn05Y=

服務總線

/TCLOykE3mgZ8Lxe2/N7VAZAo3pSn5K48y54Xoss4Pw=

IoT中心

xv8FF7ja0QpPHcWE9B1wB3Ge7pLyj0ZvickxQAOdk/Y=

可以看到一般情況下密鑰的長度是44個字符,其中存儲比較特殊有88個字符。而構成有以下這些元素:

- 字母,而且大小寫敏感 (a - z,A - Z)

- 數字(0 - 9)

- 特殊字符(/,+,=)

考慮到字符‘=’只是用做結尾,因此我們計算出一般情況下密鑰的可能性有:

(26*2 + 10 + 2)^44 = 64^44

也就是64的44次方,而存儲賬戶更是多達64的88次方。這種情況下要暴力破解,可能性實在太低。

問:密鑰是否會在傳輸的過程中被截取?

答:客戶可能會有這樣的疑問,在客戶端使用Azure PaaS的SDK時,一般需要提供連接字符串,或者是密鑰直接作為參數,感覺密鑰就跟普通的用戶名密碼一樣,會被傳輸到服務端來做對比驗證,因此覺得密鑰有可能在傳輸過程中被截取。

首先,所有的傳輸都是加密的(SSL\TLS)。但這還不是關鍵點,更關鍵的是,密鑰其實壓根就不會被傳輸,被用來傳輸和驗證的是令牌(Token)。也就是說SDK拿到提供的密鑰,會根據密鑰生成相應的令牌,再傳輸令牌到服務端做驗證。而令牌本身是被限制了訪問範疇和生命周期的,因此比起密鑰的安全性會高得多。

問:在客戶端,密鑰無論是明文寫在代碼裏,還是配置文件中,都不安全,有沒有更安全的方式?

答:當然有。就跟生活中把貴重物品放在保險箱裏一樣,我們也可以把密鑰放在保險箱裏。Azure密鑰保管庫就是這樣一個服務,可以將密鑰保存到其中,授權的客戶端在需要的時候再從中獲取。這樣的話,既使得密鑰能被集中管理,而且能使密鑰管理者和使用者分離,提高了安全性的同時,更提供了便捷性。更多了解Azure密鑰保管庫,可參閱以下文章:

- Azure密鑰保管庫介紹

- Azure密鑰保管庫入門

- Azure密鑰保管庫使用

那麽除了這種方式之外,還有沒有別的辦法呢?上一個問題中我們提到通過令牌來認證,也就是說客戶端其實不一定要知道密鑰,它只要能提供正確的令牌就可以了,因此我們可以創建一個專門生成令牌的集中管理服務,授權的客戶端只需要調用這個服務,就可以拿到目標資源的訪問令牌,這樣也可以避免密鑰被客戶端顯示的知道。當然這種方法需要自己創建一個專門生成令牌的服務,所以比起使用Azure密鑰保管庫的方式要復雜些。

Azure PaaS服務密鑰的安全性