获取可用密码算法的列表

您如何学习可用的密码算法? 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 providers
        for (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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值