當前位置:
首頁 > 知識 > 4.一次性密碼 && 身份認證三要素

4.一次性密碼 && 身份認證三要素


在信息安全領域,一般把Cryptography稱為密碼,而把Password稱為口令。日常用戶的認知中,以及我們開發人員溝通過程中,絕大多數被稱作密碼的東西其實都是Password(口令),而不是真正意義上的密碼。本文保持這種語義,採用密碼來代指Password,而當密碼和口令同時出現時,用英文表示以示區分。

0. OTP一次性密碼

OTP是One Time Password的簡寫,即一次性密碼。在平時生活中,我們接觸一次性密碼的場景非常多,比如在登錄賬號、找回密碼,更改密碼和轉賬操作等等這些場景,其中一些常用到的方式有:

  1. 手機簡訊+簡訊驗證碼;
  2. 郵件+郵件驗證碼;
  3. 認證器軟體+驗證碼,比如Microsoft Authenticator App,Google Authenticator App等等;
  4. 硬體+驗證碼:比如網銀的電子密碼器;

這些場景的流程一般都是在用戶提供了賬號+密碼的基礎上,讓用戶再提供一個一次性的驗證碼來提供一層額外的安全防護。通常情況下,這個驗證碼是一個6-8位的數字,只能使用一次或者僅在很短的時間內可用(比如5分鐘以內)。

1. HOTP基於消息認證碼的一次性密碼

HOTP是HMAC-Based One Time Password的縮寫,即是基於HMAC(基於Hash的消息認證碼)實現的一次性密碼。演算法細節定義在RFC4226(https://tools.ietf.org/html/rfc4226),演算法公式為: HOTP(Key,Counter) ,拆開是 Truncate(HMAC-SHA-1(Key,Counter)) 。

  1. Key:密鑰;
  2. Counter:一個計數器;
  3. HMAC-SHA-1:基於SHA1的HMAC演算法的一個函數,返回MAC的值,MAC是一個20bytes(160bits)的位元組數組;
  4. Truncate:一個截取數字的函數,以3中的MAC為參數,按照指定規則,得到一個6位或者8位數字(位數太多的話不方便用戶輸入,太少的話又容易被暴力猜測到);

C#實現基於HMAC的OTP的代碼:

1 public static string HOTP(byte[] key, byte[] counter, int length = 6)
2 {
3 var hmac = counter.ToHMACSHA1(key);
4
5 var offset = hmac[hmac.Length - 1] & 0xF;
6
7 var b1 = (hmac[offset] & 0x7F) << 24;
8 var b2 = (hmac[offset + 1] & 0xFF) << 16;
9 var b3 = (hmac[offset + 2] & 0xFF) << 8;
10 var b4 = (hmac[offset + 3] & 0xFF);
11
12 var code = b1 | b2 | b3 | b4;
13
14 var value = code % (int)Math.Pow(10, length);
15
16 return value.ToString.PadLeft(length, "0");
17 }

調用一下試試看:

1 //密鑰key
2 var key = "lnh_key".ToBytes(Encoding.UTF8);
3 //計數器
4 var counter = "lnh_counter".ToBytes(Encoding.UTF8);
5 //otp6=752378
6 var otp6 = SecurityHelper.HOTP(key, counter,6);
7 //otp8=49752378
8 var otp8 = SecurityHelper.HOTP(key, counter, 8);

其中key是HOTP演算法需要的一個密鑰(不可泄露);counter是每次生成HOTP的時候使用的計數器,使用一次就更換一個。然後就可以用來生成OTP了,第一此截取了6位,第二此截取了8位。

2. TOTP基於時間的一次性密碼

TOTP是Time-Based One Time Password的縮寫。TOTP是在HOTP的基礎上擴展的一個演算法,演算法細節定義在RFC6238(https://tools.ietf.org/html/rfc6238),其核心在於把HOTP中的counter換成了時間T,可以簡單的理解為一個當前時間的時間戳(unixtime)。一般實際應用中會固定一個時間的步長,比如30秒,60秒,120秒等等,也就是說再這個步長的時間內,基於TOTP演算法算出的OTP值是一樣的。廢話不多說,看看TOTP演算法的核心代碼:

1 public static string TOTP(byte[] key, int step = 60, int length = 6)
2 {
3 var unixTime = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
4 var counter = ((int)unixTime) / step;
5 var counterBytes = BitConverter.GetBytes(counter);
6 return HOTP(key, counterBytes, length);
7 }

調用一下試試看:

//密鑰key
var key = "lnh_key".ToBytes(Encoding.UTF8);
//在10秒內生成,otp是一樣的
for (var i = 0; i < 100; i++)
{
var otp = SecurityHelper.TOTP(key, 10, 6);
Console.WriteLine(otp);
Thread.Sleep(1000);
}

4.一次性密碼 && 身份認證三要素


3. 身份認證三要素

首先解釋下什麼是身份認證?其實很簡單,就是讓對方相信你就是你。那麼如何讓對方相信你就是你呢?按照你能提供的信息的等級來劃分,大致有如下三種信息可以證明你就是你自己:

  1. 你所知道的信息:比如我們最廣泛使用的「

    用戶名+密碼

    」,因為只有你自己知道「

    用戶名+密碼

    」這個信息組合,那麼當你把這個組合提供給我的時候,我就可以相信你就是你。
  2. 你所擁有的信息:假如你的「用戶名+密碼」泄露給了第三方,這個時候你就會有被第三方冒充的危險了。怎麼辦呢,再進一步提供一個只有

    你自己擁有的信息

    ,即可防止被第三方冒充的危險。
  3. 你所獨有的信息:再假設一下,你擁有的信息也被泄露給了第三方,這個時候你又會面臨被冒充的危險。再進一步,提供一個只有

    你自己所獨有的的信息

    ,比如你的指紋,虹膜,面部特徵等等。

3.1 2SV 兩步驗證(Two Steps Verification)

兩步驗證現在是一個再加強認證安全方面廣泛使用的一個解決方案。比如Google的2SV(https://www.google.com/landing/2step/),Microsoft的2SV(https://support.microsoft.com/zh-cn/help/12408/microsoft-account-about-two-step-verification)等等,通常的做法是當用戶輸入了"用戶名+密碼"的基礎上,會讓用戶再提供一個一次性密碼(以簡訊、郵件,或者動態密碼生成器app的方式發放給用戶)。再有比如在一些服務中需要用戶額外設置的安全問題,比如「你的出生地在哪?」等等此類。

3.2 2FA雙因素認證(Two Factor Authentication)

2SV有個孿生兄弟2FA(雙因素認證:Two Factor Authentication),那麼關於2SV和2FA有什麼區別呢,比如讓用戶在「用戶名+密碼」的基礎上提供的額外的一次性密碼,關於這個一次性密碼到底是屬於「你所知道的信息」還是「你所擁有的信息」呢?並沒有明顯的區分界限,有興趣的可以看看這裡的討論:https://security.stackexchange.com/questions/41939/two-step-vs-two-factor-authentication-is-there-a-difference。 如果你覺得這個一次性密碼屬於「你所知道的信息」,那麼你可以認為它是2SV;如果你覺得這個一次性密碼屬於「你所擁有的信息」,那麼你可以認為它是2FA。

總結來說,2FA就是使用了身份認證中的2個要素。


總結 & 參考

簡單的介紹了下一次性密碼的原理以及其應用場景,完整的代碼請移步:https://github.com/linianhui/code/blob/master/src/SecurityHelper.cs 。如有錯誤之處,歡迎指正!

參考資料

HOTP(HMAC-Based One Time Password)RFC:https://tools.ietf.org/html/rfc4226

TOTP(Time-Based One Time Password)RFC:https://tools.ietf.org/html/rfc6238

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

使用Spring boot + jQuery上傳文件(kotlin)
一步一步學Vue(四)
一種基於kafka+storm實現的日誌記錄方法(二)
誰將新樽辭舊月,今月曾經照古人
python實現發郵件

TAG:達人科技 |

您可能感興趣

11 requests的身份認證方式
數字身份解決方案提供商Learning Machine獲300萬美元種子融資
Spelunky 2宣布,將探索父母身份 Guacamelee!2宣布
點融網獲得2.9億美元D輪融資,Facebook收購身份認證技術公司Confirm.io
詳解K8S與Rancher 2.0內的身份認證與授權
Microsoft Edge瀏覽器宣布支持Web身份驗證
Serena Williams 和身份政治
想要入手不容易!AJ1 「Homage To Home」 限量身份有講究?
Identity Server 4-Hybrid Flow-MVC客戶端身份驗證
思科Elastic Services Controller服務埠存在身份繞過漏洞,請儘快升級更新
Air Max 1/97 免費送,陳冠希以「商人」身份登上《T Magazine》封面 | HB Daily
Facebook或將收購身份證驗證軟體公司Confirm
Pharrell x adidas 全新聯名 SOLARHU 發布,Space X 首位繞月旅客身份曝光| HB Daily
蘋果神秘新機現身Geekbench,A11處理器加持身份引發猜測
牙買加「飛人」Usain Bolt 將以球員身份亮相 Old Trafford 球場
身份連三變!歐洲太空總署:Oumuamua 是彗星
AKB48宮脅咲良:以練習生的身份參加《Produce 48》的真正原因
苟芸慧以首位香港藝人身份紐約欣賞Tiffany Paper Flower 系列
INS:為A.I.產品提供bot註冊、身份驗證和審核功能
fate/stay night命運之夜你知道所有英靈的真實身份?