1. ホーム
  2. php

[解決済み】PHPでパスワードを暗号化・復号化する最適な方法とは?[重複している]。

2022-04-08 12:59:12

質問

<ブロッククオート

重複の可能性があります。

PHPの2ウェイ暗号化。検索可能なパスワードを保存する必要がある

私のウェブサイトでは、rapidshareのユーザー名やパスワードなど、ユーザーの海外アカウント情報を保存する予定です。私は情報を安全に保ちたいのですが、彼らの情報をハッシュ化すると、後で使用するためにそれを取得することができないことを知っています。

Base64は復号化できるので、そのまま使っても意味がない。 私のアイデアは、ユーザーとパスをbase64化する前と後にスクランブルすることで、復号化した後でも、復号化しようとするとおかしなテキストが表示されます。文字列のユニークなスクランブルを作成し、後で値が再計算されたときにそれをデスクランブルする値を受け入れるPHP関数はありますか?

何か提案はありますか?

解決方法は?

パスワードは暗号化せず、bcryptなどのアルゴリズムでハッシュ化する必要があります。 この回答は、PHPでパスワードハッシュを適切に実装する方法について説明しています。 . それでも、暗号化/復号化する方法は以下の通りです。

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

暗号化すること。

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

復号化すること。

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);


注意事項 : 上記の例では、情報を暗号化していますが、改ざんを防ぐための暗号文の認証は行っていません。 あなたは ない セキュリティのために認証されていない暗号化に依存すること 特に、提供されたコードはパディングオラクル攻撃に対して脆弱であるためです。

こちらもご覧ください。

また、暗号化キーに "パスワード" を使用するだけではありません。 暗号化キーはランダムな文字列です。


3v4l.orgでのデモ :

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "