雜亂大全04-資安與加密的那些事(2):PBKDF2、Scrypt、Bcrypt(補充)

  • 主題:雜亂大全04-資安與加密的那些事(2):PBKDF2、Scrypt、Bcrypt(補充)

  • 前言:接續前篇講述基礎的加密與資訊安全,並針對PHP、Python、C#來進行實作

  • 叮嚀: $ 代表對CMD或terminal(終端機)下指令

tags: php,encrypt,Bcrypt,PBKDF2

本篇重點:

  1. 簡介常見的加密手法(Bcrypt、PBKDF2、Scrypt)
  2. 自身的實作經驗

接續前篇簡介常見的hash

當然還有很多,但是主要以最常使用的為主

  • 在某些領域中,會將hash和加密分開討論
  • 本篇接續前篇介紹Bcrypt、PBKDF2、Scrypt

非常推薦的hash-Bcrypt (補充)

補充上次所講,使用Bcrypt為PHP的首選
另外,上次未提到的sult函數更改
原因是因為希望大家使用預設即可
PASSWORD_DEFAULT

PHP文件有特別寫到:
The salt option has been deprecated as of PHP 7.0.0. It is now preferred to simply use the salt that is generated by default.

範例:

1
2
3
4
5
6
7
8
<?php
/**
* This is presently BCRYPT, and will produce a 60 character result.
* Beware that DEFAULT may change over time, so you would want to prepare
* By allowing your storage to expand past 60 characters (255 would be good)
*/
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>

執行結果:
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

另外也可以調整他的cost
一般建議使用預設10



非常推薦的加密函式-PBKDF2

屬於比較好的加密方式之一
PBKDF2將偽隨機函數(HMAC)與鹽值一起應用於密碼,並重複多次此過程以生成派生密鑰,然後可以將該密鑰用作後續操作中。增加的計算工作使密碼破解變得更加困難,這被稱為密鑰擴展。

(美國國家標準技術研究院建議鹽長度為128位)

實際的函式過程本篇不贅述,可以參考以下

PHP使用的方式,帶入各項參數即可使用
範例:

1
2
3
4
5
6
7
8
9
10
11
<?php
$password = "password";
$iterations = 1000;

// Generate a random IV using openssl_random_pseudo_bytes()
// random_bytes() or another suitable source of randomness
$salt = openssl_random_pseudo_bytes(16);

$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);
echo $hash;
?>

執行結果:
120fb6cffcf8b32c43e7

  • 第一個參數使用hash演算法(推薦:sha256以上)
  • 第二參數為密碼文本
  • 第三參數是你的salt(建議長度128)
  • 第四參數是疊代的次數(1000次以上)
  • 第五參數是輸出的字串長度


非常新的金鑰衍生函式-Scrypt

於2009年所發明的金鑰衍生函式,設計時考慮到大規模的客製硬體攻擊而刻意設計需要大量記憶體運算。
2016年,scrypt演算法發布在RFC 7914。
scrypt的簡化版被用在密碼貨幣的工作量證明(Proof-of-Work)上。


小結語:

在儲存密碼上
首選Bcrypt或PBKDF2而不是前篇所提SHA256
其原因之一是此類的加密方式
因為有疊代(防暴力法破解)、有salt(防彩虹表)
因此很難在GPU加速運算中有效實現破譯


後續:

本篇開始介紹基礎的hash以及後來延伸的加密函式(金鑰衍生函式),後續也將介紹金鑰使用與加密協定的溝通,下篇會介紹AES的實作


參考連結


<追隨前輩們的腳步,不停往前。>

  • 任何問題,請聯繫我:liao86221@gmail.com