1. 程式人生 > >RSA的運用和前後端簽名的一些看法

RSA的運用和前後端簽名的一些看法

RSA在驗簽過程的使用場景分析

	RSA的文章有很多。原理性學術性的對於我這樣普通的碼農毫無意義,對於我來說,我只想知道為什麼我們要用RSA,以及什麼
	情況下我們需要使用它?這是一篇粗淺且迅速入門的文章。

首先,我要介紹RSA驗籤的流程,稍後再分析為啥要這樣做。
場景是存在(A)要傳輸資料給(B)。為方便起見,我們把資料稱為(R)。
此時:A與B各自持有自己的privateKey,以及公之於眾的publicKey(由RSA演算法生成)。以下我們簡稱PVK(A)、PVK(B)、PUK(A)、PUK(B)。
A:
①使用某種演算法給資料加密,通常會是MD5。我們得到密文M(R)。
②A對M(R)使用PVK(A)加密,得到RSA(M(R))。
③把RSA(M(R)) + R 這樣的組合使用B公佈的PUK(B)加密,得到最終的密文,簡稱F(R)。
B:
①B使用PVK(B)解密F(R)得到 RSA(M(R)) + R
到這一步,B已經拿到需要的R了,但是,他不知道R是否是A傳來的,需要驗籤。
②B使用A公佈的PUK(A)解密RSA(M(R))得到M(R)
③B使用MD5演算法對R加密,得到M(R),比較兩個M(R)是否一致,若一致,則驗籤成功。

不按照上述方式驗籤會造成的問題

那麼假如上述方案去掉幾步,會不會就不能成功驗簽了呢?
那我們不妨做一些假設。假如我就是不法分子C,偽造資料與B通訊。

場景①:A只用了PUK(B)加密,B用PVK(B)解密。也就是所有操作閹割得只剩1步。
C:因為PUK(B)是公之於眾的,所以我把偽造資料C也使用PUK(B)加密即可。

場景②:A使用PUK(B)加密(M(R)+R)的密文,用於MD5校驗,是否能阻止C呢?
C:顯而易見。我對(M(C)+C)使用PUK(B)加密,B解密後,依然無法驗證C是否是正確的資料。

場景③:也就是按照上述流程,在M(R)上再套一層PVK(A)加密,會怎麼樣呢?
C:因為C沒有PVK(A),只有PVK(C),所以B用PUK(A)無法解密RSA(M(C)),識破了C的陰謀。

日常前後端互動簡化版的RSA應用分析

假如只是系統內部驗籤,其實不用這麼麻煩。伺服器A與B只需要各自約定加密方式即可。

最簡化版的是:
A:
①對R做一些約定好的操作,生成R2。
②使用MD5加密,得到M(R2)。
③傳送M(R2)+R

B:
①對R做相同的操作,生成R2。
②使用MD5加密,得到M(R2)。
③驗證M(R2)是否相同,若相同,則驗籤成功。

但是這樣的系統存在一些問題。
假如只有兩個系統,那麼沒問題。但是假如有A、B、C、D、E、F等等,系統很多的話,他們之間的加密規則會變混亂,也許EF通訊錯轉發資料給了A,A也順利驗籤通過。所以我們需要給AB、AC、AD、AE、AF、BC …都建立一套新R約定的規則,過於麻煩。因此RSA此時就是這樣一個規範且不需要額外記憶的規則。

因此我們在上述步驟中,對M(R2)再使用PVK(AB)加密,得到RSA(M(R2))。(驗籤始終使用PVK加密,這樣不法分子C無法對資料偽造。)
這樣,B端就可以使用和A約定好的PUK(AB)解密資料,再使用MD5驗簽了。

我總結一下RSA:
①假如傳輸資料不能被第三方看見,則用PUK加密。反過來,用什麼都行。
②驗籤只能使用PVK加密,這樣才能防止偽造資料。
因此RSA很好理解,就是PVK加密用於防止偽造,再用PUK加密用來隱藏資料。