60305
H2DBでフォームから入力したパスワードの暗号化と復号化のSQLを教えていただきたいです。

```

    insert into table(user_name, user_pass) values (?, crypt(?, gen_salt('bf')))
    
```

また、cryptを使うことはできないのですか？
CC BY-SA 4.0
2019-11-03T14:24:34.060
60223
2019-11-19T01:14:22.610
2019-11-07T01:27:49.543
2238
36468
question
sql encryption
H2DBでのパスワード暗号化、復号化の方法
`crypt`, `gen_salt` で検索したところ
[PostgreSQLのリファレンス](https://www.postgresql.jp/document/11/html/pgcrypto.html#id-1.11.7.34.6)がヒットしたので、PostgreSQLの該当関数に相当するH2DBの関数は何か、という質問だとして回答しますと:

  * 上のリンク先にある通り、`crypt`は(暗号化関数ではなく)ハッシュ関数なので復号はできません。
  * H2DBの備えるハッシュ関数として [`hash`](http://www.h2database.com/html/functions.html#hash)があります。リンク先例文の通りパスワード格納も想定した関数だとは思いますが、PostgreSQLのものとは大きく仕様が異なります。
  * `crypt` はPostgreSQL独自の関数なので他のDBMSでは利用できません(過去のMySQL [`encrypt`](https://dev.mysql.com/doc/refman/5.6/ja/encryption-functions.html#function_encrypt)のように似たものを備えるDBMSもあるようですが)。

* * *

production環境ではPostgreSQLを、development環境ではH2DBを、というようなことを考えられているのであれば、DBMSの機能でなくプログラミング言語/フレームワークの機能でハッシュ化するのも一案かと考えます。要は、DBMS依存を排除する、ということです。

* * *

Spring Boot であれば、Spring Security の
[`PasswordEncoder`](https://docs.spring.io/spring-
security/site/docs/5.2.1.RELEASE/reference/html/jc-authentication.html#core-
services-password-encoding) を利用するのが一般的かと思います。

依存関係を追加し、

```

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
```

Bean定義を行えば、

```

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
    
```

インジェクションして利用できます。

```

    @Autowired
    private PasswordEncoder passwordEncoder;
    
    ...
        final String password = passwordEncoder.encode("mypassword");
    
```

[サンプルコード](https://github.com/yukihane/stackoverflow-
qa/blob/master/so60223/src/main/java/com/example/passwordencodersample/PasswordEncoderSampleApplication.java)
CC BY-SA 4.0
2019-11-07T01:17:07.960
60305
2019-11-19T01:14:22.610
2019-11-19T01:14:22.610
2808
2808
60223
answer