相同类设计的加密/解密版本

时间:2012-11-13 22:02:29

标签: java design-patterns encryption decorator

这是一个设计问题,我将尽可能地缩小它以避免将其标记为开放式。

问题

需要一种有效的方法来设计一个或两个包含相同数据的类,但是一个将数据字段作为加密字符串,第二个将它们作为解密字符串或整数。我收到加密的数据,我解密一次,并允许我的应用程序使用解密的版本。

我拥有什么

我提出了不同的解决方案,但对其中任何一个都不满意。这就是我试过的:

  1. 一个带有布尔标志`encrypted`的类,最初设置为`true`,然后在解密数据后取消设置。缺点,相同的字段是多用的,即使有私人标志,听起来也不安全;另一个骗局,一些字段在解密时是不同类型的,比如一个ID,理想情况下我希望解密版本的格式是正确的,因此不会将新字段添加到同一个类中,这会使它变得混乱并且会使复杂化其他任务,如数据绑定等
  2. 考虑装饰模式,但它的工作方式是让装饰器和主题类实现相同的接口,但是再次返回类型会在解密后发生变化
  3. 考虑过有2个类,一个用于类的解密版本,另一个用于加密。然而,在这种方法中放弃了代码重用,以解决关于让解密版本扩展加密版本并重新使用解密后不改变类型的加密字段的getter的想法,但是改变类型的字段不能被覆盖
  4. 考虑过即使在解密之后仍然以String格式保留数据,并转换为类外的整数,但这是多余的,每当我需要使用类的整数字段时,我的代码都会被愚蠢的代码片段混乱
  5. 有关如何解决此设计问题的任何想法?

2 个答案:

答案 0 :(得分:1)

将它们分开。将加密类视为消息类,将解密类视为实体对象。您将来应用的数据类型和任何字段验证的变化将更加易于管理。即使像字段宽度那样简单的东西在加密时也可能会更大。

答案 1 :(得分:1)

加密字段的最佳方法是简单地序列化对象实例并加密生成的流。要获取解密的对象实例,只需解密流并反序列化该对象。