Sun在制定加密算法的标准名称而不是命名常量时做出的决定是否存在理由?
似乎Sun(好吧,现在是Oracle)在documenting algorithm names中提出了明确的努力,但是没有在库中提供强定义的命名常量。我理解,从跨平台的角度来看,字符串搜索方法是有利的。
然而,这样做意味着编程错误会延迟到运行时,我只能看到让事情变得比必要更困难。这是为什么?
答案 0 :(得分:1)
我猜这将允许您提出自己的非标准名称和工厂实现。 (或允许将来使用不存在的名称的插件),而不会导致编译错误。
这也允许用户在运行时添加新的加密类,方法是在编译时将类添加到类路径中。
答案 1 :(得分:1)
例如String
Cipher.getInstance(String algorithm)
不包含单个名称,它也包含转换。你会得到类似"DES/CFB8/NoPadding"
的东西,表示DES算法,在密码反馈模式下,8位输出,不需要填充。这种组合也可以用于其他密码。所以这已经产生了许多等于cipher * modes * bitsizes * paddingmodes
的常数。现在你可以创建单独的枚举,但是你已经可以看到它会开始受到伤害。
字符串比枚举或(甚至不去那里)常量更灵活。这使得添加其他算法变得非常容易。您甚至可以在旧版软件中添加算法并对其进行配置;只需添加一个实现给定算法的提供程序。当在从提供者和服务构建的动态框架中使用时,这非常重要。
正如Luiggi指出的那样,创建一个带有枚举并返回Cipher
或Signature
实例的工厂非常容易。你只需要对工厂进行一次测试。