ホームページ  >  記事  >  バックエンド開発  >  PHP簡易携帯電話認証コード認証プロセス

PHP簡易携帯電話認証コード認証プロセス

WBOY
WBOYオリジナル
2016-06-13 12:05:571087ブラウズ

PHP シンプルな携帯電話認証コードの認証プロセス
私は要件を設けました。広告主がバックエンドでアンケート活動を開始し、一般ユーザーがアンケートに参加した後に特定の Web サイトにジャンプして 1Q ポイント (1 ダイム) を受け取ります。一定期間オンラインで広告が表示され、主なフィードバックから受け取った携帯電話番号の多くは偽のものでした (携帯電話番号が正しいかどうかを判断するために通常の照合のみを使用するようになりました)。その後、製品は携帯電話番号を追加するよう求めてきました。

PHP簡易携帯電話認証コード認証プロセス


最初のアイデアは、rand を使用してランダムなコードを生成し、それを Redis に保存するというごく普通のことです。後で考えたのですが、ユーザーは 1 ディムの支払いを望んでいません。これについても、システムは認証コードをむやみに入力することはありません。明日はそのようなアクティビティに 1 日に 5 回だけ参加できる ID を使用して、システム リソースを無駄にしないようにするために、会社から送信されるテキスト メッセージにはすでに 2 セントのコストがかかるため、redis を使用しないことにし、次のアイデアを使用しました。 >
ユーザー アカウントのアクティビティ ID と携帯電話番号を使用して固定番号を生成し、運転タイムスタンプを使用して干渉して 4 桁の番号を生成します。干渉後は、対応する数字のみが保証されます。数値の 2 進数 1、5、6、7、8、9 は影響を受けません。この対応により pow(2,6) の異なる 4 桁の数値が生成され、そのうちの 1 つがユーザーにランダムに送信されます。

ユーザーが確認コードを確認する場合、確認コードの 1、5、6、7、8、9 の数字が正しいかどうかのみが確認され、ユーザー アカウントのアクティビティ ID と携帯電話番号が処理されます。が生成されるため、携帯電話番号を確認するために番号を保存する必要はありません。

具体的なテスト例は以下のとおりです。なぜテスト例と呼ばれているのでしょうか。最終的には動作しなかったので、クローズド形式で他のプロジェクトを開発することにしたため、次のコードに遭遇しました。コードを見ると私の作品であることが判明しました。
PHP簡易携帯電話認証コード認証プロセス は、テストコードによって生成された検証コードがうまくハッシュ化されておらず、改善する時間がありません。主に上記のアイデアを紹介します。 PHP簡易携帯電話認証コード認証プロセス

<?php/** * * User: shikiliu * Date: 13-7-11 */class TelephoneCheck{    /**     * 取得某个用户某次活动的手机验证码     * @param $uin 用户ID 小于10000系统保留     * @param $actId 活动ID  小于1000系统保留     * @param $telephone 用户手机号     * @return bool|int 4位数的验证码     */    public function getTelephoneCode($uin, $actId, $telephone)    {        if ($uin < 10000 || $actId < 1000 || empty($telephone)) {            return false;        }        $time = time();        $timeFeature = hexdec(substr(md5($time), 0, 3)) & 0x1F1;        $telephoneFeature = hexdec(substr(md5($telephone), 8, 4));        $actIdFeature = hexdec(substr(md5($actId), 16, 4));        $uinFeature = hexdec(substr(md5($uin), 24, 4));        $sumFeature = $telephoneFeature + $actIdFeature + $uinFeature;        $sumFeature = $sumFeature % 10000;        if ($sumFeature < 1000) {            $sumFeature = 5145;        }        $result = $sumFeature | $timeFeature;        return $result;    }    /**     * 验证用户的手机验证码     * @param $uin 用户ID 小于10000系统保留     * @param $actId 活动ID  小于1000系统保留     * @param $telephone 用户手机号     * @param $code getTelephoneCode生成的验证码     * @return bool 是否正确     */    public function  checkTelephoneCode($uin, $actId, $telephone, $code)    {        if ($uin < 10000 || $actId < 1000 || empty($telephone) || empty($code)) {            return false;        }        $telephoneFeature = hexdec(substr(md5($telephone), 8, 4));        $actIdFeature = hexdec(substr(md5($actId), 16, 4));        $uinFeature = hexdec(substr(md5($uin), 24, 4));        $sumFeature = $telephoneFeature + $actIdFeature + $uinFeature;        $sumFeature = $sumFeature % 10000;        if ($sumFeature < 1000) {            $sumFeature = 5145;        }        $sumFeature = $sumFeature & 0xE0E;        $code = $code & 0xE0E;        if ($sumFeature == $code) {            return true;        }        return false;    }}$actId = 10001;$telephone = 13797025562;$uin = 514540767;$telCode = new TelephoneCheck();$code = $telCode->getTelephoneCode($uin, $actId, $telephone);var_dump($code);var_dump($telCode->checkTelephoneCode($uin, $actId, $telephone, $code));var_dump($telCode->checkTelephoneCode($uin, $actId, $telephone, $code+10));

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。