MySQLで個人情報をマスキングする方法(一文字残して*で埋める)

背景

本番環境のデータを検証環境で利用する際に、個人情報を適切にマスキングが必要になりました。

具体的には、名前などの個人情報を変換し、一部の文字を残して他は*で置き換える必要があります。

例
変換前 -> 変換後
鈴木一郎 -> 鈴***
山田太郎 -> 山***

データベースにはMySQL 5.7が使用されています。

解決方法

MySQLで特定の条件で文字列を変換するためには、SUBSTRINGやCONCATなどの文字列関数を利用します。

以下は、usersテーブルのname列に対して、一文字目を残し、残りの文字を*で埋めるSQLの例です。

UPDATE users
SET name = CONCAT(SUBSTRING(name, 1, 1), REPEAT('*', CHAR_LENGTH(name) - 1))

このクエリでは、SUBSTRING関数で文字列の最初の文字(一文字目)を抽出し、REPEAT関数で残りの文字を*で埋めます。
最終的にCONCAT関数でこれらを結合して、変換された名前を取得します。

最後に

プログラムでレコードを1つずつ取得し文字列を変換する方法もありますが、SQLを使用することで効率的に変換できました。

Laraveでフィールドの値をランダムな整数値に更新する

Laraveでフィールドの値をランダムな整数値に更新するには、MySQLのRAND()関数とCEIL()関数を使います。

RAND()関数は0以上1以下のランダムな浮動小数値を返します。

RAND()関数の返り値を2147483647倍すると、0以上2147483647以下のランダムな値になります。

CEIL()関数は引数の値を切り上げて整数値を返すので、RAND()関数の返り値にCEIL()関数を適用すると、0以上2147483647以下の整数値をランダムに生成できます。

次のコードは、すべてのUserのtokenフィールドをランダムな値に更新する例です。

// すべてのUserのtokenフィールドをランダムな値に更新
User::query()->update(['token' => DB::raw('CEIL(RAND() * 2147483647)')]);

Laravel SailでSSL(HTTPS)接続するには

Laraveでアプリケーションを開発しているする場合、Laravel Sailを使うと「http://~」でプロジェクトにアクセスできます。

しかし、使用する機能によっては(たとえばWebRTCを使う場合)、「https://〜」でアクセスする必要があります。

Sail-SSL」は、Laravel SailでHTTPS接続を設定するためのプラグインです。

Sail-SSLを使うと、Laravel Sailで簡単に「https://〜」にアクセスできるようになります。

Sail-SSLの導入

すでにLaravel Sailを使ったアプリケーションが存在する場合は、次の手順で導入できます。

(1) Laravel Sailを起動します。

./vendor/bin/sail up -d

(2) 以下のコマンドを実行して、Sail-SSLをインストールします。

./vendor/bin/sail composer require ryoluo/sail-ssl --dev

「composer require ryoluo/sail-ssl –dev」は、Sail-SSLをインストールするためのコマンドです。
このコマンドを実行すると、Sail-SSLのプラグインがインストールされます。

(3) 以下のコマンドを実行して、SSLを有効にします。

./vendor/bin/sail artisan sail-ssl:install

「sail-ssl:install」は、Sail-SSLを使ってSSLを有効にするコマンドです。
このコマンドを実行すると、Nginxの設定が変更され、HTTPS接続が有効になります。

(4) 以下のコマンドを実行して、Laravel Sailを再起動します。

./vendor/bin/sail down
./vendor/bin/sail up

コンテナーが起動したら「https://localhost」でアクセスできるようになります。

HTTPSアクセスの強制

リンクのURLがhttpになっています。
httpsでアクセスするように設定します。

app/Providers/AppServiceProvider.phpを編集します。

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        URL::forceScheme('https');
    }

ViteのSSL対応

httpsでアクセスできるようになりましたが、まだViteがhttpsに対応していません。
httpsとhttpが混在するとMixed Contentのエラーになります。

vite-plugin-basic-ssl」をインストールして、ViteをSSLに対応します。

npm i -D @vitejs/plugin-basic-ssl

インストールが完了したら、「vite.config.js」を編集します。

// vite.config.js
import basicSsl from '@vitejs/plugin-basic-ssl'

export default {
  plugins: [
    basicSsl()
  ]
}

以上で、自己証明書が作成され、httpsでアクセスできるようになります。

Xcodeで「The provided entity includes an attribute with an invalid value」エラーが発生する原因と解決方法

XcodeでAnalyzeを実行すると、以下のエラーが発生することがあります。

The provided entity includes an attribute with an invalid value

このエラーは、バージョン番号に不正な文字が含まれている場合に発生します。

具体的には、バージョン番号は、以下の形式でなければなりません。

[0-9]+\.[0-9]+\.[0-9]+

例えば、1.2.3、4.5.6、10.0.0 などの形式は正しく、1.2.3a、1.2.3b、1.2.3c などの形式は不正です。

バージョン番号を修正して、正しい形式にすると、このエラーは解消されます。

  1. プロジェクト内のバージョン番号を確認し、無効な文字や記号が含まれていないかを確認します。バージョン番号は通常、メジャーバージョン、マイナーバージョン、パッチバージョンなどの数字と、それらを区切るドットで構成されます。
  2. バージョン番号に無効な文字が含まれている場合、正しい形式に修正します。
  3. Analyzeを実行し、エラーが解消されていることを確認します。

なお、このエラーは、App Store Connectにアプリをアップロードする際にも発生することがあります。