यदि आप एप्लिकेशन में काम करना समाप्त कर देते हैं, तो आप हाइबरनेट कस्टम प्रकारों का उपयोग कर सकते हैं और यह आपके कोड में कई बदलाव नहीं जोड़ेगा।
यहाँ एक एन्क्रिप्टेड स्ट्रिंग कस्टम प्रकार है जिसका मैंने उपयोग किया है:
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-विशिष्ट नहीं है। हम एईएस का उपयोग कर रहे हैं, उदा। "सिफर सिफर =Cipher.getInstance('AES/CBC/PKCS5Padding')"। आप जो कुछ भी उपयोग कर रहे हैं, सुनिश्चित करें कि यह 2-तरफा क्रिप्टो है, यानी SHA-256 का उपयोग न करें।