遗传算法可用什么算法代替
您如何了解可用的密码算法? Java规范列出了几种必需的密码,摘要等,但是提供程序通常提供的不止这些。
幸运的是,这很容易了解我们系统上的可用内容。
public class ListAlgorithms {public static void main(String[] args) {// Security.addProvider(new// org.bouncycastle.jce.provider.BouncyCastleProvider());// get a list of services and their respective providers.final Map<String, List<Provider>> services = new TreeMap<>();for (Provider provider : Security.getProviders()) {for (Provider.Service service : provider.getServices()) {if (services.containsKey(service.getType())) {final List<Provider> providers = services.get(service.getType());if (!providers.contains(provider)) {providers.add(provider);}} else {final List<Provider> providers = new ArrayList<>();providers.add(provider);services.put(service.getType(), providers);}}}// now get a list of algorithms and their respective providersfor (String type : services.keySet()) {final Map<String, List<Provider>> algs = new TreeMap<>();for (Provider provider : Security.getProviders()) {for (Provider.Service service : provider.getServices()) {if (service.getType().equals(type)) {final String algorithm = service.getAlgorithm();if (algs.containsKey(algorithm)) {final List<Provider> providers = algs.get(algorithm);if (!providers.contains(provider)) {providers.add(provider);}} else {final List<Provider> providers = new ArrayList<>();providers.add(provider);algs.put(algorithm, providers);}}}}// write the results to standard out.System.out.printf("%20s : %s\n", "", type);for (String algorithm : algs.keySet()) {System.out.printf("%-20s : %s\n", algorithm,Arrays.toString(algs.get(algorithm).toArray()));}System.out.println();}}
}
系统管理员可以覆盖标准密码库。 在实践中,最安全的方法是始终加载自己的加密库并如上所述手动注册,或者最好在创建新对象时将其作为可选参数传递。
演算法
有几十种标准算法。 我们最可能感兴趣的是:
对称密码
- KeyGenerator –创建对称密钥
- SecretKeyFactor –在对称密钥和原始字节之间转换
- 密码 -加密密码
- AlgorithmParameters –算法参数
- AlgorithmParameterGernerator –算法参数
非对称密码
- KeyPairGenerator –创建公用/专用密钥
- KeyFactor –在密钥对和原始字节之间转换
- 密码 -加密密码
- 签名 –数字签名
- AlgorithmParameters –算法参数
- AlgorithmParameterGernerator –算法参数
文摘
- MessageDigest –摘要(MD5,SHA1等)
- Mac – HMAC。 像消息摘要一样,但也需要加密密钥,因此攻击者无法伪造它
证书和密钥库
- 密钥库 – JKS,PKCS等
- CertStore –类似于密钥库,但仅存储证书。
- CertificateFactory –在数字证书和原始字节之间转换。
重要的是要记住,大多数算法都是为了向后兼容而提供的,不应在未开发的领域中使用。 在我撰写本文时,普遍接受的建议是:
- 使用AES的变体。 仅在绝对确定知道不会加密一个以上的块大小(16字节)的数据时,才使用AES-ECB。
- 即使使用AES-CBC,也应始终使用良好的随机IV。 不要使用相同的IV或容易预测的IV。
- 不要在不对称密钥中使用少于2048位。
- 使用SHA-256或更高版本。 MD-5被视为已损坏,SHA-1将在不久的将来被视为已损坏。
- 使用PBKDF2WithHmacSHA1从密码/密码短语创建AES密钥。 (另请参见创建基于密码的加密密钥 。)
有些人可能想使用其他AES候选密码之一(例如, twofish )。 这些密码可能是安全的,但是如果与其他方共享文件,则可能会遇到问题,因为它们不在所需的密码套件中。
当心美国出口限制
最后,重要的是要记住,由于美国的出口限制,标准的Java发行版已经瘫痪了。 您可以通过在系统上安装标准的仅限美国的文件来获得全部功能,但是对于开发人员来说,要确认这一点已经完成就很难了。 实际上,即使不是大多数人,许多人也会使用BouncyCastle之类的第三方加密库。 许多没有经验的开发人员对此一无所知,并无意中使用了残缺的功能。
翻译自: https://www.javacodegeeks.com/2014/08/getting-a-list-of-available-cryptographic-algorithms.html
遗传算法可用什么算法代替