安全存储口令的业界标准:bcrypt算法

最后谈一谈安全保护口令的的标准算法,这就是 bcrypt 算法。为了把事情说清楚,分两篇文章描述:

  • 说说 bcrypt 算法,以及通过PHP的crypt()算法进一步参数阐述,虽然crypt()算法已经不推荐使用了,但对于理解 bcrypt 算法还是非常好的,可以看看它的历史。
  • 在一个系统中,如果有多种开发语言,那么 bcrypt 算法是否通用呢?通过 PHP 和 Ptyhon 语言进行描述。

本文主要理解 bcrypt 算法,bcrypt 算法可以认为是 KDF 函数的一种实现,也有迭代因子的概念。

bcrypt 算法基于 Blowfish 块密钥算法,bcrypt 算法已经有10多年的历史,而 Blowfish 密钥算法更是有20多年的历史,久经考验,所以被认为是 Hash 加密口令的标准算法。

bcrypt 算法在内部会使用内存初始化 hash 过程,由于需要内存,虽然在 CPU 上运行很快,但在 GPU 并行运算却不快,这也减缓了攻击者的破解速度。

接下去我使用 PHP 语言中的 crypt() 函数介绍如何使用 bcrypt 算法,如果你对 Hash 保护口令了解的不多,那么使用 crypt() 函数可能会存在很多问题。

首先必须明确 crypt() 函数并不是 bcrypt 算法,它可以基于多种不同的 Hash 算法

该函数的原型:

string crypt ( string $str [, string $salt ] )

看上去很简单,但隐藏了很多内容。

如果你仅仅调用 crypt(),会根据操作系统版本和 PHP 版本使用相应的 Hash 算法,而且如果不显示的输入 salt,可能会得到一个弱 salt,所以不推荐这样调用 crypt() 函数,因为屏蔽了很多细节。

那么如何选定 bcrypt 算法(Blowfish)、迭代因子、salt,先看一个例子:

if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish:' . crypt('abcde', '$2a$07$woshiyigesaltzhi') . "\n";
}
  • 2a 表示使用 bcrypt 算法(注意:如果是 PHP 5.3.7 后续版本,使用 2y,修复了安全风险)。
  • 07 表示迭代次数为 7 次。
  • 最后一个 $ 后面内容为 salt 值。

接下去看看上面代码的输出:

Blowfish:$2a$07$woshiyigesaltzhi$$$$$.lrU488y7E1Xw.JA4uizIu.PBSSe7t4y

也就是说返回值包含了 crypt() 函数相关信息,比如告诉你使用了 bcrypt 算法,迭代因子是 7,salt 是 woshiyigesaltzhi$$$$$,剩下的部分就是口令密文。

此处,遗留一个问题,crypt() 运算出来的口令密文包含 salt 是否不安全?这会在下一篇中描述

crypt() 也可以使用其它的 Hash 函数,比如:

  • CRYPT_MD5: 1
  • CRYPT_BLOWFISH:2a2y
  • CRYPT_SHA256:5
  • CRYPT_SHA512:6

大家大概明白 crpyt() 函数的使用了,可能使用的时候有点麻烦,所以建议包装下该函数:

function better_crypt($input, $rounds = 7) {
    $salt = openssl_random_pseudo_bytes(22);
    return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt);
}

不管怎么说,crypt() 函数完全基于底层的 C 函数,运行环境也依赖于操作系统和PHP版本,系统和代码迁移的时候可能有多种问题,所以 PHP 从 5.5 版本以后建议使用 Password Hashing Functions,这在下一篇会详细说一下。

最后简单提下 scrypt 算法,它是一种新的口令保护算法,是另外一种思路,被认为是口令保护的业界标准算法,但由于时间较短,现在建议还是使用 bcrypt() 算法

口令保护系列文章:


了解我的书《深入浅出HTTPS:从原理的实战》,如果觉得还不错,还请在豆瓣上做个评论 https://book.douban.com/subject/30250772/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,048评论 6 542
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,414评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,169评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,722评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,465评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,823评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,813评论 3 446
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,000评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,554评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,295评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,513评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,035评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,722评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,125评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,430评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,237评论 3 398
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,482评论 2 379

推荐阅读更多精彩内容