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

アプリケーションに対して完全に透過的なデータベースのHibernate暗号化

    アプリケーションでの作業を終了した場合は、Hibernateカスタムタイプを使用でき、コードにそれほど多くの変更が追加されることはありません。

    これが私が使用した暗号化された文字列のカスタムタイプです:

    import org.hibernate.usertype.UserType
    import org.apache.log4j.Logger
    
    import java.sql.PreparedStatement
    import java.sql.ResultSet
    import java.sql.SQLException
    import java.sql.Types
    
    class EncryptedString implements UserType {
    
      // prefix category name with 'org.hibernate.type' to make logging of all types easier
      private final Logger _log = Logger.getLogger('org.hibernate.type.com.yourcompany.EncryptedString')
    
      Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException {
        String value = rs.getString(names[0])
    
        if (!value) {
          _log.trace "returning null as column: $names[0]"
          return null
        }
    
        _log.trace "returning '$value' as column: $names[0]"
        return CryptoUtils.decrypt(value)
      }
    
      void nullSafeSet(PreparedStatement st, Object value, int index) throws SQLException {
        if (value) {
          String encrypted = CryptoUtils.encrypt(value.toString())
          _log.trace "binding '$encrypted' to parameter: $index"
          st.setString index, encrypted
        }
        else {
          _log.trace "binding null to parameter: $index"
          st.setNull(index, Types.VARCHAR)
        }
      }
    
      Class<String> returnedClass() { String }
    
      int[] sqlTypes() { [Types.VARCHAR] as int[] }
    
      Object assemble(Serializable cached, Object owner) { cached.toString() }
    
      Object deepCopy(Object value) { value.toString() }
    
      Serializable disassemble(Object value) { value.toString() }
    
      boolean equals(Object x, Object y) { x == y }
    
      int hashCode(Object x) { x.hashCode() }
    
      boolean isMutable() { true }
    
      Object replace(Object original, Object target, Object owner) { original }
    }
    

    これに基づいて、int、longなどの同様のクラスを簡単に作成できます。これを使用するには、マッピングクロージャーに型を追加します。

    class MyDomainClass {
    
      String name
      String otherField
    
      static mapping = {
        name type: EncryptedString
        otherField type: EncryptedString
      }
    }
    

    CryptoUtils.encrypt()メソッドとCryptoUtils.decrypt()メソッドは、Grails固有ではないため、省略しました。 AESを使用しています。例: 「Ciphercipher=Cipher.getInstance('AES / CBC / PKCS5Padding')」。最終的に使用するものが何であれ、それが双方向暗号であることを確認してください。つまり、SHA-256を使用しないでください。



    1. SQL Server 2012 ServicePack1および累積的な更新プログラム1

    2. mysqlクエリで選択した対角領域間のデータを正確に見つける方法

    3. Postgresql:MacOSXを使用してpg_hba.confファイルを見つける方法

    4. SQL Serverエラー213:列名または指定された値の数がテーブル定義と一致しません。