它是目前所述,MD5部分不安全。考虑到这一点,我想知道哪些机构使用的密码保护。

这个问题, 是"双散列"一个密码不太安全的不仅仅是哈希它一次? 表明,散列多次可能是一个很好的想法,但 如何实现的密码保护个人的文件呢? 建议使用盐。

我使用的PHP.我想要一个安全和快速的密码加密系统。哈密码一百万的时间可能会更安全,但是还慢。如何实现良好的平衡和速度之间的安全?此外,我希望的结果具有恒定的数字。

  1. 散列机构必须提供PHP
  2. 它必须是安全的
  3. 它可以使用盐(在这种情况下,所有的盐同样很好吗?是否有任何方式产生良好的盐?)

此外,我应该商店的两个领域中数据库(一个使用MD5和另一个使用沙,例如)?它将使它更加安全或unsafer?

在情况下,我是不是足够清楚,我想要知道其中的散列函数(s)使用以及如何挑选一个良好的盐,以便有一个安全和快速的密码保护的机制。

相关的问题,不掩盖我的问题:

之间的区别是什么沙和MD5在PHP
简单的密码加密的
安全的方法的储存键密码asp.net
你会如何实现咸密码在Tomcat5.5

有帮助吗?

解决方案

免责声明:这个答案是写在2008年。

自那以后,PHP给了我们 password_hashpassword_verify 而且,由于他们的介绍,他们的建议密散列&检查方法。

该理论的答案仍然是一个很好的阅读。

TL博士

不该做什么

  • 不要限制是什么字用户可以输入密码。只有白痴这样做。
  • 不要限制长度的一个密码。如果你的用户想要一个句子与你,不要阻止他们使用它。
  • 从来没有存储用户的密码以纯文本。
  • 从来没有邮箱密码为用户 除非他们已经失去了他们,和你发送一个临时的一个。
  • 永远不要登录密码,以任何方式。
  • 从来没有哈密码 SHA1 或MD5或甚至SHA256! 现代化的饼干 可以超过60和180亿哈希/第二(分别)。
  • 不混合的 bcrypt和与 输出哈希(), ,无论是使用六输出或base64_encode。(这适用于任何输入,可能有一个流氓 \0 在它,它可能严重削弱的安全。)

Dos

  • 使用大的下行压力,现在长时你能;bcrypt如果你不能。
  • 使用PBKDF2如果你无法使用bcrypt或大的下行压力,现在长,SHA2哈希。
  • 重每个人的密码数据库时受到损害。
  • 实现一个合理的8-10字符的最低限度,加上需要至少1上写字母,1的情况下字母、数字和符号。这将提高熵的密码,反过来使它更难以破解。(见"是什么让一个良好的密码?"部分的一些辩论。)

为什么哈密码呢?

目标背后的散列密码是简单的:防止恶意用户账户的影响的数据库。因此我们的目标的密散列是阻止黑客或裂解器的成本计算它们太多的时间或金钱计算的纯文本的密码。和时间/成本是最好的威慑在你的武器库。

另一个原因,你想要一个良好、稳健的散列上一个用户账户是给你足够的时间来改变所有的密码系统。如果你的数据库受到损害,你会需要足够的时间在 锁定系统下,如果不改变每个密码的数据库。

耶利米*格罗斯曼首席技术官的白帽安全, 表示在他的博客 之后,最近的一个密码恢复所需的暴力破坏他的密码保护:

有趣的是,在生活的这个噩梦,我学到了很多我不知道密码破解、存储和复杂性。 我来理解为什么密码存储以往更重要的不是密码的复杂性。如果你不知道你的密码储存,那么你真的可以依赖的是的复杂性。 这可能是共同的知识密码和密码的利弊,但对于一般信息安全或网络安全专家,我强烈怀疑。

(着重号是我的。)

是什么让一个 很好的 密码呢?

.(不,我完全赞同他的观点。)

总之,熵是多少变化紧密码。当一个密码是只小写的罗马字母,那就是只有26个字符。这是没有多大变化。字母与数字密码更好,有36个字符。但允许上下情况下,与符号,大约96个字符。这是一个好多了不仅仅是字母。一个问题是,要使我们的密码令人难忘,我们插入模式--这降低了熵。哎呀!

密码熵 近似的 很容易。使用的全部范围的ascii characters(大约96该键人物)产量的熵的6.6每字,它在8个字符的密码还是太低(52.679位的熵)为未来的安全。但好消息是:再密码和密码unicode的人物,真正增加的熵的密码并使其更难以破解。

有再讨论的密码熵上 加密的回答# 网站。一个很好的Google搜索也将打开了大量的结果。

在评论我跟@popnoodles,他指出, 强制执行 一个密码政策的X长与X许多字母、数字、符号,等等,实际上可以减少熵通过使密码的方案更可预测。我不同意.Randomess,作为真正随机的可能,永远是安全的,但最难忘的解决方案。

到目前为止,我已经能够告诉,使世界上最好的密码是一个赶上-22.要么是其不令人难忘,也可以预见的,太短,太多的unicode字(难的类型在Windows/移动设备),时间过长,等等。没有密码是真正的好足够我们的目的,因此,我们必须保护他们,因为虽然他们在诺克斯堡。

最佳做法

Bcrypt和 大的下行压力,现在长 是的当前最佳做法。 大的下行压力,现在长 会更好比bcrypt的时间,但它没有看到通过作为一个标准的Linux/Unix或通过网络服务器,并没有深入审评其算法发布。但是,未来的算法看起来很有希望。如果您使用的是红宝石有一个 大的下行压力,现在长的宝石 这会帮助你,Node.js 现在已经有了自己的 大的下行压力,现在长 包。你可以用大的下行压力,现在长在PHP通过 大的下行压力,现在长 扩展或 Libsodium 扩展(两者都可以在PECL).

我强烈建议阅读的文件 墓穴功能 如果你想了解如何使用bcrypt,或者发现自己一个 很好的 包装纸 或者使用什么样的 PHPASS 对于一个更加传统的执行。我推荐一个最小的12轮bcrypt,如果不是15到18岁。

我改变主意的关于使用bcrypt当我得知bcrypt只使用河豚的关键时间表,与可变成本的机制。后者让你增加的成本以暴力破解密码通过增加河豚已经昂贵的关键时间表。

平均做法

我几乎不可能想象这种情况了。 PHPASS 支持PHP3.0.18通过5.3,因此它是可用于几乎每一个安装可以想象的--而且应该被用如果你不 肯定知道 环境支持bcrypt.

但是假设你不能使用bcrypt或PHPASS。什么然后呢?

尝试一个实现的 PDKBF2最大数发子弹 环境/应用/用户认知能容忍的。最低数目,我建议你是2500回合。此外,还要确保使用 hash_hmac() 如果这是可以使操作困难重现。

未来的做法

即将在PHP5.5是 全密码保护的图书馆 该摘要的任何痛苦的工作与bcrypt.虽然我们大多数被卡住PHP5.2和5.3最常见的环境,尤其是共享主机,@ircmaxell已经建立了一个 兼容性层 为即将到来的API是向后兼容PHP5.3.7.

密码回顾一下与免责声明

计算所需要的电力实际上 裂纹 一散列的密码不存在。唯一的方式计算机"破裂"一个密码是重建和模拟的散列算法用来保护它。速的散列的线性相关的能力可以强强迫。更糟糕的是,最散列算法可以很容易地并行执行,甚至更快。这就是为什么代价高昂的方案喜欢bcrypt和大的下行压力,现在长这么重要的。

你不可能预见到的所有威胁或途径的攻击,所以你必须让你尽最大努力保护你的用户 最前面.如果你不这样做,那么你甚至可能会错过的事实,你被攻击,直到为时已晚... 和你在负责.为了避免这种情况下,行事偏执的开始。攻击你自己的软件(内部)和企图窃取用户证书,或修改其他的用户账户或进入他们的数据。如果你不测试安全系统,然后你不能责怪任何人,但自己。

最后:我不是一个密码.无论我说的是我的意见,但我认为这是基于好ol'共同的感觉...和大量的阅读。记得,是因为偏执,尽可能使事情一样硬闯入尽可能的,然后,如果你们仍然担心,接触一个白帽子的黑客或密码看见他们说什么关于你的码系统。

其他提示

一个更短的和更安全的答案 不要写你自己的密码机构在所有, 使用一个久经考验的机制。

  • PHP5.5或更高: password_hash() 是质量好的部分PHP的核心。
  • 老年PHP versions:OpenWall的 phpass 图书馆是更好的比大多数定义的代码使用中的文件:博客、资源链接,等等。

大多数程序员只是没有的专门知识编写的加密相关代码的安全而引入的脆弱性。

快速的自我试验: 什么是密码的拉伸和多少次迭代,你应该使用?如果你不知道答案,就应该使用 password_hash(), 如密码的拉伸现在是一个关键特征的密码机制由于更快的Cpu和使用 Gpu和Fpga 破解密码的 数十亿的猜测每秒 (与Gpu).

例如,你可以 破解的所有8个字符的窗户密码在6小时 使用25Gpu安装在5桌面电脑。这是强迫即枚举和检查 每个8字窗户密码, 包括特殊字符,并不是字典的攻击。那是在2012年,正如2018年你可以用较少的集,或者快裂25Gpu。

也有很多彩虹表袭击窗户密码运行的普通Cpu和非常快。所有这一切都是因为Windows 仍然 不盐或拉伸 它的密码, 即使在Windows10 -不要犯同样的错误作为Microsoft没有!

参见:

  • 优秀的回答 与更多关于为什么 password_hash()phpass 是最好的路要走。
  • 好的博客的文章 给防腐蚀设计推荐的工作的因素'(多次)为主要的算法,包括bcrypt,大的下行压力,现在长和PBKDF2.

我不会以两种不同的方式存储密码哈希,因为系统至少与使用中最弱的哈希算法一样弱。

从PHP 5.5开始,PHP具有简单,安全的哈希和验证密码功能, password_hash() password_verify()

$password = 'anna';
$hash = password_hash($password, PASSWORD_DEFAULT);
$expensiveHash = password_hash($password, PASSWORD_DEFAULT, array('cost' => 20));

password_verify('anna', $hash); //Returns true
password_verify('anna', $expensiveHash); //Also returns true
password_verify('elsa', $hash); //Returns false

当使用 password_hash()时,它会生成一个随机盐并将其包含在输出的哈希值中(以及使用的成本和算法。) password_verify()然后读取该哈希并确定使用的salt和加密方法,并根据提供的明文密码对其进行验证。

提供 PASSWORD_DEFAULT 指示PHP使用已安装的PHP版本的默认哈希算法。究竟是哪种算法意味着在未来版本中随时间变化,因此它始终是最强大的可用算法之一。

增加成本(默认为10)会使散列更难以暴力破解,但也意味着生成散列并验证密码对您的服务器的CPU来说将更有效。

请注意,即使默认的哈希算法可能会发生变化,旧的哈希值也会继续验证,因为所使用的算法存储在哈希值中,并且 password_verify()会选中它。

虽然问题已得到解答,但我只想重申,用于散列的盐应该是随机的,而不是像第一个答案中建议的电子邮件地址。

有更多解释,请访问 http:/ /www.pivotalsecurity.com/blog/password-hashing-salt-should-it-be-random/

  

最近我讨论了密码哈希是否随机腌制   比可猜测或已知的盐更安全   盐。让我们看看:如果系统存储密码被泄露为   以及存储随机盐的系统,攻击者将会   有权访问哈希以及盐,所以盐是随机的还是   不,不重要。攻击者可以生成预先计算的   彩虹表破解哈希。这是有趣的部分   生成预先计算的表并不是那么简单。让我们举个例子   WPA安全模型。您的WPA密码实际上从未发送过   无线接入点。相反,它是用您的SSID(   网络名称 - 如Linksys,Dlink等)。一个非常好的解释如何   这项工作就在这里。为了从哈希中检索密码,你会   需要知道密码以及salt(网络名称)。教堂   Wifi已经预先计算了具有前1000个SSID和的散列表   大约100万个密码。所有表的大小约为40 GB。   正如您可以在他们的网站上阅读的那样,有人在3天内使用了15个FGPA阵列   生成这些表。假设受害者正在使用SSID   “ a387csf3″和密码为“ 123456″,它会被那些人破解   表?没有! .. 这不可以。即使密码很弱,表也是如此   不要使用SSID a387csf3的哈希值。这就是拥有的美   随机盐。它将阻止在预先计算的情况下茁壮成长的破解者   表。它可以阻止坚定的黑客吗?可能不是。但是使用   随机盐确实提供了额外的防御层。我们在的时候   这个主题,让我们讨论存储随机的额外优势   在单独的系统上的盐。场景#1:存储密码哈希值   在系统X上,用于散列的盐值存储在系统Y上。   这些盐值是可猜测的或已知的(例如用户名)场景#2:   密码哈希值存储在系统X和用于的盐值上   散列存储在系统Y上。这些盐值是随机的。如果   系统X已经被破坏,你可以猜到,有一个巨大的   在单独的系统上使用随机盐的优势(场景#2)。   攻击者需要猜测附加值才能破解   哈希值。如果使用32位盐,则2 ^ 32 = 4,294,967,296(约4.2   猜测每个密码都需要迭代。

我只想指出,PHP5.5包括 密码哈希API 提供的包装 crypt().这API大大简化了的任务的散列、核查和老调重弹密码的散列。提交人还发布了一个 兼容包 (在所形成的一个单password.php 文件说你只是 require 使用),对于那些使用PHP5.3.7和后并想使用现在这个权利。

它只支持BCRYPT的现在,但它的目标是很容易地扩大到包括其他密码的散列技术和因为技术和成本的储存的一部分散,改变你喜欢的散列技术/成本不会使当前的散列值,该框架将自动的,使用正确的技术/费用时,验证。它还处理产生一个"安全"盐如果没有明确界定自己。

API暴露了四个功能:

  • password_get_info() -返回的有关信息给予哈希
  • password_hash() -创建一个密码哈
  • password_needs_rehash() -检查,如果指定的哈希匹配给出的选择。用以检查,如果哈希符合当前技术/费用方案,允许你老调重弹,如果有必要
  • password_verify() -验证密码相匹配哈希

目前,这些功能接受的PASSWORD_BCRYPT和PASSWORD_DEFAULT密码常数,它们是同义的时刻,一的区别是,PASSWORD_DEFAULT"可以改变新PHP版本时更新的、更强大的散列算法的支持。" 使用PASSWORD_DEFAULT和password_needs_rehash()上登录(和重复的,如果必要)应该确保你的散列值是合理的弹性暴力攻击几乎没有为你工作。

编辑:我只是意识到,这是简要提及在罗伯特*K的答复。我会离开这个答案在这里,因为我认为它提供更多的信息,它是如何工作和便于使用,它提供了对于那些不知道的安全。

我正在使用 Phpass 这是一个简单的单文件PHP类,几乎可以在每个PHP中轻松实现项目。另请参见 H

默认情况下,它使用在Phpass中实现的最强可用加密,即 bcrypt ,然后回退到MD5以外的其他加密,以向Wordpress等框架提供向后兼容性。

返回的哈希可以按原样存储在数据库中。生成哈希的示例用法是:

$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);

要验证密码,可以使用:

$t_hasher = new PasswordHash(8, FALSE);
$check = $t_hasher->CheckPassword($password, $hash);

要记住的事情

关于PHP的密码加密已经说了很多,其中大部分都是非常好的建议,但在你开始使用PHP进行密码加密之前,请确保已经实现了以下内容或准备好实现。

服务器

PORTS

如果您没有正确保护运行PHP和DB的服务器,那么无论您的加密有多好,您的所有努力都毫无价值。大多数服务器的功能相同,它们分配了端口,允许您通过ftp或shell远程访问它们。确保更改了您具有活动状态的远程连接的默认端口。通过不执行此操作,您实际上已使攻击者在访问系统时减少了一步。

USERNAME

对于世界上所有好的东西,请不要使用用户名admin,root或类似的东西。此外,如果您使用的是基于unix的系统,请不要使root帐户登录,只应该是sudo。

PASSWORD

您告诉您的用户制作好的密码以避免遭到黑客攻击,也可以这样做。当后门敞开时,经过所有锁定前门的努力有什么意义。

<强> DATABASE

SERVER

理想情况下,您希望将DB和APPLICATION放在不同的服务器上。由于成本原因,这并不总是可行的,但它确实允许一些安全,因为攻击者必须通过两个步骤才能完全访问系统。

USER

始终让您的应用程序拥有自己的帐户来访问数据库,并且只为其提供所需的权限。

然后为您提供一个单独的用户帐户,该帐户不会存储在服务器上的任何位置,甚至不会存储在应用程序中。

总是不要做这个根或类似的东西。

PASSWORD

遵循与所有正确密码相同的指导原则。也不要在同一系统上的任何SERVER或DB帐户上重复使用相同的密码。

<强> PHP

PASSWORD

永远不会在您的数据库中存储密码,而是存储哈希和唯一的盐,我将在稍后解释原因。

HASHING

单方式哈希!!!!!!!,永远不要以可以反转的方式哈希密码,哈希应该是一种方式,这意味着你不要反转它们并将它们与密码进行比较,而是哈希输入密码的方式相同,并比较两个哈希值。这意味着即使攻击者可以访问数据库,他也不知道实际的密码是什么,只是它产生的哈希值。这意味着在最糟糕的情况下为您的用户提供更高的安全性。

有很多好的散列函数( password_hash hash 等等)但是你需要为散列选择一个好的算法有效。 (bcrypt和类似它的是不错的算法。)

当散列速度是关键时,对Brute Force攻击的抵抗力越强。

散列中最常见的错误之一是散列并非用户独有。这主要是因为盐不是唯一产生的。

盐析

密码应始终在哈希之前加盐。 Salting会在密码中添加一个随机字符串,因此类似的密码在数据库中看起来并不相同。但是,如果盐不是每个用户独有的(即:你使用硬编码的盐),那么你的盐几乎没有价值。因为一旦攻击者找到一个密码盐,他就会为所有人提供盐。

当你创建一个盐时,确保它对于密码是唯一的,然后将完成的哈希和盐存储在你的数据库中。这样做是为了让攻击者在获得访问权限之前必须单独破解每个盐和哈希值。这意味着一个

谷歌称PHP可以使用SHA256。

你绝对应该使用盐。我建议使用随机字节(而不是限制自己的字符和数字)。通常情况下,选择的时间越长,越安全,越慢。我猜是64字节应该没问题。

我找到了完美的专题这个问题在这里: https://crackstation.net/hashing-security.htm, 我想让你从中获得好处,这里是源代码还提供防止基于时间的攻击。

<?php
/*
 * Password hashing with PBKDF2.
 * Author: havoc AT defuse.ca
 * www: https://defuse.ca/php-pbkdf2.htm
 */

// These constants may be changed without breaking existing hashes.
define("PBKDF2_HASH_ALGORITHM", "sha256");
define("PBKDF2_ITERATIONS", 1000);
define("PBKDF2_SALT_BYTES", 24);
define("PBKDF2_HASH_BYTES", 24);

define("HASH_SECTIONS", 4);
define("HASH_ALGORITHM_INDEX", 0);
define("HASH_ITERATION_INDEX", 1);
define("HASH_SALT_INDEX", 2);
define("HASH_PBKDF2_INDEX", 3);

function create_hash($password)
{
    // format: algorithm:iterations:salt:hash
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM));
    return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" .  $salt . ":" . 
        base64_encode(pbkdf2(
            PBKDF2_HASH_ALGORITHM,
            $password,
            $salt,
            PBKDF2_ITERATIONS,
            PBKDF2_HASH_BYTES,
            true
        ));
}

function validate_password($password, $good_hash)
{
    $params = explode(":", $good_hash);
    if(count($params) < HASH_SECTIONS)
       return false; 
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}

// Compares two strings $a and $b in length-constant time.
function slow_equals($a, $b)
{
    $diff = strlen($a) ^ strlen($b);
    for($i = 0; $i < strlen($a) && $i < strlen($b); $i++)
    {
        $diff |= ord($a[$i]) ^ ord($b[$i]);
    }
    return $diff === 0; 
}

/*
 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
 * $algorithm - The hash algorithm to use. Recommended: SHA256
 * $password - The password.
 * $salt - A salt that is unique to the password.
 * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000.
 * $key_length - The length of the derived key in bytes.
 * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise.
 * Returns: A $key_length-byte key derived from the password and salt.
 *
 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
 *
 * This implementation of PBKDF2 was originally created by https://defuse.ca
 * With improvements by http://www.variations-of-shadow.com
 */
function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
{
    $algorithm = strtolower($algorithm);
    if(!in_array($algorithm, hash_algos(), true))
        die('PBKDF2 ERROR: Invalid hash algorithm.');
    if($count <= 0 || $key_length <= 0)
        die('PBKDF2 ERROR: Invalid parameters.');

    $hash_length = strlen(hash($algorithm, "", true));
    $block_count = ceil($key_length / $hash_length);

    $output = "";
    for($i = 1; $i <= $block_count; $i++) {
        // $i encoded as 4 bytes, big endian.
        $last = $salt . pack("N", $i);
        // first iteration
        $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
        // perform the other $count - 1 iterations
        for ($j = 1; $j < $count; $j++) {
            $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
        }
        $output .= $xorsum;
    }

    if($raw_output)
        return substr($output, 0, $key_length);
    else
        return bin2hex(substr($output, 0, $key_length));
}
?>

最后,数学上的双重散列不会带来任何好处。然而,在实践中,它对于防止基于彩虹表的攻击是有用的。换句话说,它与使用salt进行散列相比没有什么好处,它可以在您的应用程序或服务器上花费更少的处理器时间。

我通常使用SHA1和salt与用户ID(或其他一些用户特定的信息),有时我还使用恒定的盐(所以我有2份盐)。

SHA1现在也被认为有些受到损害,但程度远远低于MD5。通过使用盐(任何盐),您将阻止使用通用的彩虹表攻击你的哈希(有些人甚至通过搜索哈希使用谷歌作为一种彩虹表获得了成功)。可以想象,攻击者可以使用您的盐生成彩虹表,这就是为什么您应该包含用户特定的盐。这样,他们将不得不为系统中的每个记录生成彩虹表,而不仅仅是整个系统的一个!通过这种类型的腌制,即使MD5也非常安全。

SHA1 和一个盐就足够了(当然,取决于你是否为 Fort Knox 或您购物清单的登录系统)在可预见的未来。如果SHA1不够好,请使用 SHA256

盐的想法是让哈希结果失去平衡,所以说。例如,已知空字符串的MD5哈希是 d41d8cd98f00b204e9800998ecf8427e 。所以,如果有足够好内存的人会看到那个哈希并知道它是空字符串的哈希值。但是如果字符串被加盐(例如,使用字符串“ MY_PERSONAL_SALT ”),则“空字符串”(即“ MY_PERSONAL_SALT ”)的哈希变为 aeac2612626724592271634fb14d3ea6 ,因此回溯非显而易见。我想说的是,最好使用任何盐,而不是。因此,了解使用哪种盐并不是太重要。

实际上有这样做的网站 - 你可以提供一个(md5)哈希,并且它会吐出一个生成该特定哈希的已知明文。如果您可以访问存储普通md5哈希值的数据库,那么为这样的服务输入管理员的哈希并登录将是微不足道的。但是,如果密码被腌制,这样的服务将成为无效的。

此外,双散列通常被认为是不好的方法,因为它会减少结果空间。所有流行的哈希都是固定长度的。因此,您只能拥有此固定长度的有限值,并且结果变得不那么多变。 可以被视为另一种形式的腌制,但我不推荐它。

确定 在适合我们需要盐 盐必须是独一无二的 所以让它生成

   /**
     * Generating string
     * @param $size
     * @return string
     */
    function Uniwur_string($size){
        $text = md5(uniqid(rand(), TRUE));
        RETURN substr($text, 0, $size);
    }

我们也需要哈希 我正在使用sha512 这是最好的,它是在PHP

   /**
     * Hashing string
     * @param $string
     * @return string
     */
    function hash($string){
        return hash('sha512', $string);
    }

现在我们可以使用此功能生成安全密码

// generating unique password
$password = Uniwur_string(20); // or you can add manual password
// generating 32 character salt
$salt = Uniwur_string(32);
// now we can manipulate this informations

// hashin salt for safe
$hash_salt = hash($salt);
// hashing password
$hash_psw = hash($password.$hash_salt);

现在我们需要在数据库中保存$ hash_psw变量值和$ salt变量

并且对于授权,我们将使用相同的步骤......

这是保护客户密码的最佳方式......

P.S。对于最后两个步骤,您可以使用自己的算法... 但请确保您将来可以生成此哈希密码 当你需要授权用户......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top