ログイン中のQiita Team
ログイン中のチームがありません

Qiita Team にログイン
コミュニティ
OrganizationイベントアドベントカレンダーQiitadon (β)
サービス
Qiita JobsQiita ZineQiita Blog
PHP
198
どのような問題がありますか?

投稿日

更新日

Organization

ランダムなパスワードを1行で生成する

ランダムなパスワードや文字列を生成する方法を6つ紹介します。

1. str_shuffle() を使う

  • 同じ文字が2回出ない
  • 36文字まで生成可能
<?php
function random($length = 8)
{
    return substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, $length);
}

2. mt_rand() を使う

  • 同じ文字が複数回でる可能性がある
  • 12文字まで生成可能
<?php
function random($length = 8)
{
    return base_convert(mt_rand(pow(36, $length - 1), pow(36, $length) - 1), 10, 36);
}

3. md5(uniqid()) を使う

  • 同じ文字が複数回でる可能性がある
  • 25文字まで生成可能
<?php
function random($length = 8)
{
    return substr(base_convert(md5(uniqid()), 16, 36), 0, $length);
}

sha256にすることで48文字まで生成可能になる

<?php
function random($length = 8)
{
    return substr(base_convert(hash('sha256', uniqid()), 16, 36), 0, $length);
}

4. array_reduce() を使う

  • 同じ文字が複数回でる可能性がある
  • 何文字でも生成可能
<?php
function random($length = 8)
{
    return array_reduce(range(1, $length), function($p){ return $p.str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz')[0]; });
}

5. opensslを使う

PHP - ランダムなパスワードを1行で生成する with openssl - Qiita

6. str_repeat + str_shuffle

  • 同じ文字が複数回でる可能性がある
  • 何文字でも生成可能
<?php
function random($length = 8)
{
    return substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyz', $length)), 0, $length);
}

参考: [PHP] 一行でランダムパスワードを得る方法 : してログ - LANDHERE

7. random_bytes

  • PHP7で追加された暗号学的に安全なランダムバイト生成するrandom_bytes関数を使う。
  • 同じ文字が複数回でる可能性がある
  • 出現する文字は0-9, a-fのみ
  • 何文字でも生成可能
function random($length = 8)
{
    return substr(bin2hex(random_bytes($length)), 0, $length);
}

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:Twitter@suin

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
suin
Qiita 4位/TypeScript入門書執筆中/TypeScripterのための座談会「YYTypeScript」主催/『実践ドメイン駆動設計』書籍邦訳レビュア/分報Slack考案/YYPHP主催/CodeIQマガジン執筆/株式会社クラフトマンソフトウェア創設/Web自動テスト「ShouldBee」の開発/TypeScript/DDD/OOP
craftsman_software
「インフラの心配は、もうおしまい」 インフラ運用を自動化し、手作業を限りなくゼロにする会社

コメント

リンクをコピー
このコメントを報告

UPDATED 2013/03/02 3を追加した

0
リンクをコピー
このコメントを報告

突然、すみません。
どのような利用を想定しているか分かりませんが、1.などの「同じ文字が2回出ない」という制約は、少々よろしくないかと。

1.で8桁の通りの数は「36*35*34*33*32*31*30*29」
ランダムで8桁の通りの数は「36^8」
計算すれば明らかですが 2倍以上甘くなります。

ご承知の上で書いておられるなら、申し訳ありません。
ただ、紹介するのであれば注意書きなどがないと安易に利用してしまう初心者もあるかも知れんせん。

まあ、phpで気軽に生成している以上、気軽に使ってもよい前提ではあると思います。

2
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
マイクロソフト認定資格を取得する際の学習方法や経験談、おすすめ学習リソースなどを紹介しよう!
~
198
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー