c語言pbkdf2,C語言輸入兩個整數a和b求和

本文目錄一覽:

PBKDF2函數,比「Hash加鹽」更好的口令保護方案

在前面兩篇文章中,對用戶口令進行加密的方式其實稱為 Password-based encryption (PBE),算法實現很簡單,那是不是有更好和更標準的 PBE 實現呢?

基於 Hash+salt 的算法最大的問題在於 Hash 函數的運算太快了,雖然加鹽讓暴力攻擊和彩虹表攻擊的可行性大大減低,但現在攻擊者能在非常快速的硬件(包括 GPU)上運行,如果 時間足夠 ,還是有很大幾率完成暴力破解。

那有沒有更好的解決方案嗎?如果讓口令運算運算的慢一點,那麼攻擊者破解的速度也將上不去,這樣是否就能更好的保護明文口令?

在密碼學中,key derivation function (KDF) 函數非常重要,它可以通過一個 master key(在 HTTPS 中用的非常多)、口令(password)、passphrase(密碼學隨機數生成器)生成一個或多個強壯的密鑰,這些密鑰本身被密碼學算法使用(比如 AES、RSA 等等)。

用戶的口令通過 PBF(前兩篇文章講解的算法實現)生成的口令密文不是密鑰,所以最終結果不是用於密碼學用途,是為了避免口令被破解,但本質上 BPF 算法也可以通過 KDF 函數實現,也就是利用 KDF 函數生成口令密文。

KDF 同樣基於 Hash 函數,也有 salt 機制,當然最重要的是有 迭代因子 這個概念,有了迭代因子,會讓處理速度變慢,減少爆破風險。

KDF 主要有三種實現,分別是 PBKDF2、bcrypt、scrypt ,這篇文章主要討論 PBKDF2。

稍微休息下,希望大家理解上述概念之間的區別。

KDF 本質上屬於 Key stretching、key strengthening,如果你了解 HTTPS,那麼可能比較熟悉,比如在握手階段,HTTPS 將 Premaster Secret 和客戶端服務器端的隨機數導出為 Master Secret,然後再將 Master Secret 導出為多個密鑰塊,這些密鑰塊包含 AES 的加密密鑰或者初始化向量,用戶後續通信數據的加密和完整性保護。

PBE 算法標準定義在 RFC 2898 文檔中,大概的公式如下:

如果 c 的數值越大,那麼運算速度就越慢,增加了時間複雜度,攻擊者破解的成功率就會下降。

使用 PHP 語言說明 PBKDF2 函數的使用:

對這個過程循環2000次,總共需要 16秒 ,而如果運行簡單的 Hash+salt,循環2000次,運行時間不到 0.1秒 。

從這個角度看,建議大家使用 PBKDF2 保護你的口令,但現在業界的保護口令的標準算法是 bcrypt ,下一篇文章會講解。

口令保護系列文章:

了解我的書 《深入淺出HTTPS:從原理的實戰》 ,如果覺得還不錯,還請在豆瓣上做個評論(地址: )。

為什麼OpenSSL的:PKCS5.pbkdf2

irb(main):029:0 iv = key_iv[cipher.key_len, cipher.iv_len]

= “`O\xF3\x94\n\xB5.y%_\xA3[\b\x16\x84\xB0”

irb(main):030:0 iv.length

= 16

irb(main):032:0 iv.each_char { |c| puts c.ord.to_s(16) }

60

4f

f3

94

a ### this one is missing in your number — it maps to \n

b5

2e

79

25

5f

a3

5b

8

16

84

b0

= “`O\xF3\x94\n\xB5.y%_\xA3[\b\x16\x84\xB0”

為什麼crypto.pbkdf2最後生成的密文長度是keylen的兩倍,而不是keylen的長度?

……你編程從來不看文檔的么?

A selected HMAC digest algorithm specified by digest is applied to derive a key of the requested byte length (keylen) from thepassword, salt and iterations.

已經明確說了,keylen 是位元組長度,32位元組的十六進制數值,用字符串表示當然就是64個字符……

原創文章,作者:YMPF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/140060.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YMPF的頭像YMPF
上一篇 2024-10-04 00:23
下一篇 2024-10-04 00:23

相關推薦

  • 利用Python實現兩個鏈表合併為一個有序鏈表

    對於開發工程師來說,實現兩個鏈表合併為一個有序鏈表是必須掌握的技能之一。Python語言在鏈表處理上非常便利,本文將從多個方面詳細闡述如何利用Python實現兩個鏈表合併為一個有序…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • 如何輸入三個整數,並輸出最大值Python

    對於初學者來說,輸入三個整數並輸出它們的最大值可能是一個比較基礎的問題。然而,它卻包含了Python中許多基本知識點的應用,因此學習它可以讓我們更好地理解Python編程語言。 一…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python隨機生成100內的10個整數

    本文將從以下幾個方面詳細闡述Python隨機生成100內的10個整數: 一、random庫介紹 在Python中,生成隨機數可以使用random庫。random庫包括兩種類型的函數…

    編程 2025-04-29
  • 全能編程開發工程師必備技能——如何優化大整數的計算

    本文將會為你分享如何解決大整數計算問題,以9999999967為例,我們將從多個方面對其做詳細闡述,並給出完整的代碼示例。 一、大整數的表示方法 在計算機中,我們通常採用二進制數來…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python定義兩個列表的多面探索

    Python是一種強大的編程語言,開放源代碼,易於學習和使用。通過Python語言,我們可以定義各種數據類型,如列表(list)。在Python中,列表(list)在處理數據方面起…

    編程 2025-04-29

發表回復

登錄後才能評論