sql >> データベース >  >> RDS >> Mysql

MYSQL:ifステートメントを使用したプロシージャ

    これらのパスワードは実際にハッシュする必要があります。次のコードを使用してください

    DELIMITER $$
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
        in_Email VARCHAR(45),
        in_PassOld VARCHAR(45),
        in_PassNew VARCHAR(45)
    )
    BEGIN
      DECLARE KnowsOldPassword INTEGER;
    
      SELECT count(*) INTO KnowsOldPassword 
        FROM User 
        WHERE Email = in_Email AND passhash = SHA2(CONCAT(salt, in_PassOld),512);
      IF (KnowsOldPassword > 0) THEN
        UPDATE User 
          SET Passhash = SHA2(CONCAT(salt, inPassNew),512) 
          WHERE Email = in_Email;
      END IF;
    END $$
    
    DELIMITER ;
    

    salt テーブルuserの追加フィールドです それは多かれ少なかれランダムですが、秘密である必要はありません。 レインボーテーブル を倒すのに役立ちます 。
    saltを短い文字列char(10)またはランダムなデータに設定できます。例えば

    salt = ROUND(RAND(unix_timestamp(now())*9999999999);
    

    ソルトを更新する必要はありません。一度生成してから保存するだけです。

    この問題の詳細については、次を参照してください:
    PHPとMySQLでハッシュを塩漬けにする
    後でプレーンテキストを取得するために、ユーザーのパスワードストレージに倫理的にアプローチするにはどうすればよいですか?

    コードへのコメント

    IF(@PassOld == in_PassOld) THEN  //incorrect 
    IF(@PassOld = in_PassOld) THEN   //correct, SQL <> PHP :-)
    



    1. mysqldumpを使用して1行に1つの挿入をフォーマットしますか?

    2. 複合インデックスの左端の列のワイルドカードは、インデックスの残りの列がインデックスルックアップ(MySQL)で使用されないことを意味しますか?

    3. SQLQUERY結果の配置の問題

    4. Oracleデータベースでの元に戻すとやり直しとは