2013-09-25 32 views
2

我相信使用PHP的password_hash()函数进行密码散列可能会传输到不同的系统,并仍然可以成功用于验证目的。PHP password_hash():密码哈希是否可在系统之间移植?

这是我的理解,bcrypt散列包含所有必要的组件,与纯文本密码结合时,可以验证给定的密码。正因为如此,散列可以采用兼容实现的任何系统,并用于验证目的。

我很快就会尝试,但在此之前我想知道我的理论是否正确。

这是正确的吗?

回答

3

是的,它是正确的。为password_verify文档状态:

注意password_hash()返回算法,成本和盐作为返回的哈希值的部分 。因此,需要 验证散列的所有信息都包含在其中。这允许验证功能 验证散列而不需要单独存储盐或 算法信息。

当然它也很容易地看到,这些信息有通过检查的password_hashcrypt输出(即,到overgeneralize了一下,主要是一回事)。

+0

Thankyou链接到文档。我读过password_hash()文档,并没有想到读取password_verify()函数 – michaelward82

-1

我不知道你想保存的哈希值,但如果你将它保存到数据库中,USW数据库自身的加密/散列函数 抱怨它

例如(加密)

INSERT INTO table (pass_hash,....) VALUES (MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ")) 
SELECT * FROM table WHERE pass_hash = MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ") 
+0

我们已经在使用散列。我需要知道是否有任何理由不能接受哈希值,将其存储在其他系统的其他地方,并且仍然期望验证哈希值。我看不到这个答案的相关性。 – michaelward82

2

是的,基于crypt()的哈希是便携式的;他们可以转移到任何系统,并且可以用它们成功验证给定的密码,因为它包含执行此验证的所有必要数据。

请注意,由于需要更多的迭代次数,成本较高的系统可能会导致较少的系统花费较长的时间来验证密码。

也照顾的存储要求;如果您总是使用bcrypt,则可以安全地在varchar(60)列中存储密码哈希值。否则建议使用varchar(255)

+0

我知道成本问题,但我很高兴你提到它。我选择使用二进制(60)来存储散列值 - 请参阅http:// stackoverflow。com/questions/5881169/stored-a-hashed-password-bcrypt-in-a-database-type-length-of-column – michaelward82

+0

@ michaelward82我通常在不存储区域设置敏感值的表上使用'latin1'排序规则,但'二进制'也会做得很好:) –

1

bcrypt algorythm包括它自己的载体和/或盐,应该是便携式的。哈希和vecotor/salt都不包含任何特定于系统的内容。

这也应该适用于任何不使用vecotr(或除散列之外的其他元素)或在其输出中包含此散列的任何其他algorythm。