如何使用mcrypt解密

Posted

技术标签:

【中文标题】如何使用mcrypt解密【英文标题】:how to use mcrypt decryption 【发布时间】:2012-06-10 11:56:54 【问题描述】:

我已经创建了一个登录和注册页面。但我的密码尚未加密。人们告诉我这是一个坏主意,我应该加密它们。所以我一直在寻找如何加密和解密我的密码。我找到了一个关于如何加密我的密码的示例,但我不知道如何为我的登录页面再次解密它。这是我的加密代码:

$key = "some random security key";
$input = $password;

$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$password = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

所以我的问题是:谁能告诉我我需要什么代码来解密我从上面的代码中得到的字符串。

【问题讨论】:

除非您有将密码恢复为纯文本的有效用例,否则加密不是可行的方法。研究散列,它更容易,更快,更不容易出错。在这里查看对哈希密码的良好描述:codinghorror.com/blog/2007/09/… 【参考方案1】:

你可以像这样加密和解密东西:

//this is some config for a good security level of mcrypt
define('SAFETY_CIPHER', MCRYPT_RIJNDAEL_256);
define('SAFETY_MODE', MCRYPT_MODE_CFB);

//this has to be defined somewhere in the application.
define('APPLICATION_WIDE_PASSPHRASE', 'put-something-secure-here');
define('ENCRYPTION_DIVIDER_TOKEN', '$$');

//some "example" data as if provided by the user
$password = 'this-is-your-data-you-need-to-encrypt';

//this key is then cut to the maximum key length
$key = substr(md5(APPLICATION_WIDE_PASSPHRASE), 0, mcrypt_get_key_size(SAFETY_CIPHER, SAFETY_MODE));

//this is needed to initialize the mcrypt algorythm
$initVector = mcrypt_create_iv(mcrypt_get_iv_size(SAFETY_CIPHER, SAFETY_MODE), MCRYPT_RAND);

//encrypt the password
$encrypted = mcrypt_encrypt(SAFETY_CIPHER, $key, $password, SAFETY_MODE, $initVector);

//show it (store it in db in this form
echo base64_encode($initVector) . ENCRYPTION_DIVIDER_TOKEN . base64_encode($encrypted) . '<br/>';

//decrypt an show it again
echo mcrypt_decrypt(SAFETY_CIPHER, $key, $encrypted, SAFETY_MODE, $initVector) . '<br/>';

但如前所述,密码不应从其散列表示中恢复,因此请勿对密码执行此操作!

【讨论】:

是否应该保存$initVector 以便能够解密加密值? 是的,它必须与数据一起存储在某个地方,***.com/questions/5108607/… 上有更多关于此的讨论【参考方案2】:

我看到你对它的工作原理有点困惑。阅读本文,您将了解有关加密、解密、散列及其在登录系统中的使用的所有信息。 http://net.tutsplus.com/tutorials/php/understanding-hash-functions-and-keeping-passwords-safe/

所以基本上,您在注册时将密码散列为十六进制字符串并将其存储在数据库中。每次用户想要登录时,您都会获取他当前的 i/p 密码,对其进行哈希处理并将其存储在 $temp 之类的变量中。

现在,您从服务器检索原始密码的哈希值并简单地比较两个哈希值。

...如果它们相同,则授予访问权限!

您不想继续加密和解密密码的许多原因如下:

当被传递到服务器时,用户输入的密码是明文的 文本或很容易被窃取/嗅探。 服务器必须在每次需要时计算解密存储在数据库中的密码的过程,而不是 散列,我们只是进行逻辑比较。 如果包含加密算法的文件被数据库破坏,所有密码都将以纯文本形式丢失。用户可能会使用 在多个网站上使用相同的密码,威胁就会扩大。

【讨论】:

【参考方案3】:

您不应该尝试解密密码,只需比较散列密码即可。

顺便说一句,如果您以正确的方式执行此操作,则无法恢复原始密码。您还应该添加一个所谓的盐来使密码更复杂。

【讨论】:

以上是关于如何使用mcrypt解密的主要内容,如果未能解决你的问题,请参考以下文章

Mcrypt弃用后如何解密?

如何在没有 mcrypt 的情况下使用 PHP 解密 ClickBank 通知数据?

mcrypt 如何加/解密 ?

使用 codeiginter 加密库对数据进行编码并使用 js-mcrypt 进行解密

在PHP中解密密码[关闭]

如何安装 mcrypt 并将 mcrypt.h 添加到我的 C 程序文件中?