如何在PHP中加密和解密密码?

时间:2010-10-30 21:19:44

标签: php

我想加密此语法的密码:

CWsodEV5xi9F0D8Vxw1fSZ ==

我不知道这种语法加密是什么类型

我想要加密&解密功能!

感谢

4 个答案:

答案 0 :(得分:4)

PHP有一堆内置的散列函数,所以你可以使用它们。根据PHP参考,您可以使用md5sha1hash函数。

确保在对密码进行散列之前对密码进行加密。 salt只是添加到密码中的随机数,以防止彩虹表攻击。确保每个用户的盐都是新的和随机的。

因此,您的密码数据库应包含三列:username,salt和hash。您可以通过使用存储的盐重复该过程并比较哈希来验证密码。密码永远不应以未加密或未加密的方式存储。

您描述的格式类似于base64,它不是加密或散列。请参阅有关如何编码/解码base64的其他答案,但请记住,如果您正在处理密码,则需要正确的散列。

答案 1 :(得分:2)

我不确定你要完成什么,但总的来说:请以这样一种方式开发应用程序:用户密码不能以任何方式以纯文本形式检索(例如,没有解码功能)。

由于许多用户在多个服务上使用相同的密码,我认为从技术上讲查看用户密码是不好的做法:如果您服务(或您的托管公司)某种方式无法保护数据库使用密码+ mailadresses,这些用户不在公开场合:这些凭据可能为不同应用程序/网站上的许多滥用行为敞开大门。简而言之:我甚至不想对此负责。

正如上面的一些答案所指出的,最好在您的密码系统/数据库上使用安全散列算法。散列函数是不可恢复的,这意味着:如果你这样做

valid_key = sha1(password + salt);  // store in database when user chooses / changes password

然后,如果您要对该用户进行身份验证,您只需再次执行此操作: 提供salt(也在数据库中,可以是用户名和/或随机值)并再次计算哈希值:

user_key = sha1(password_attempt + salt)

然后,您只需将user_key与valid_key进行比较:

if(user_key == valid_key)
  // authentication succesfull
else
  // wrong password

这只是一个简短的例子,当然有许多不同的实现和散列算法,这些只是基础。

散列的另一个优点是:散列(存储在应用程序中的散列,例如数据库)总是相同的长度(sha1始终是160位十六进制值)。

所以你可以让偏执的用户能够在他们喜欢的情况下制作疯狂长度的密码,其中包含所有奇怪的字符(如反引号或空格),而它不会花费你额外的存储空间。

希望我能为您提供所需的信息。当然,您可能已经知道了哈希等等,并且只是在寻找可能产生您在问题中提供的哈希的特定哈希函数。在这种情况下,只需忽略这篇文章;)

[编辑] 如今有更好的选择,例如PBKDF2,Bcrypt (see this question)甚至是Scrypt。请考虑其中一种方案,因为它们更安全,特别是对于相对较短的密码。

答案 2 :(得分:1)

我认为它是base64算法

答案 3 :(得分:0)

编码密码:

$ password = base64_encode($ string_enter_by_user);

解码密码:

$ password = base64_decode($ string_enter_by_user);

注意:您应该使用至少一种单向密码方法,如MD5,如果有一天有人访问您的数据库,您的所有用户密码都将受到保护。唯一的缺点是你永远不会知道用户密码。 MD5加密也总是32个字符。

使用MD5:

$ password = md5($ string_enter_by_user);