a

Câu hỏi Danh sách đầy đủ của MessageDigest có sẵn trong JDK


Tôi đã tìm kiếm cao và thấp cho điều này, nhưng tôi không thể có vẻ để có được một câu trả lời thẳng.

Trong Java, các MessageDigests có sẵn được xác định bởi các nhà cung cấp bảo mật mà bạn đã cấu hình / cài đặt. Nhưng giả sử chỉ là một cài đặt JDK8 bình thường (1.8.0_11 trong trường hợp của tôi), danh sách các thuật toán băm có sẵn là gì? Từ ví dụ trong tài liệu, rõ ràng là MD5, SHA1 và SHA-256 có sẵn, nhưng tôi dường như không thể có được danh sách đầy đủ, có thẩm quyền.

Danh sách này có tồn tại không, hoặc làm cách nào để tìm hiểu về cài đặt cụ thể của tôi?


10
2017-07-27 09:16


gốc


có thể trùng lặp Làm thế nào tôi có thể liệt kê các thuật toán Cipher có sẵn? - DavidPostill
@DavidPostill Không đồng ý về việc lừa đảo, những loại lừa đảo đó sẽ không hiển thị trong kết quả tìm kiếm. Chúng tôi có thể tạo một Q / A chung cho bất kỳ loại Service trong JDK, nhưng không có nó, yêu cầu cho mỗi và mọi loại thuật toán sẽ được OK. - Maarten Bodewes
@owlstead Tôi biết về câu trả lời khác khi tôi sử dụng một số mã từ nó trong một cái gì đó tôi đã chơi xung quanh với một số thời gian trước đây. Vì vậy, tôi có thể tìm kiếm "Mật mã" để tìm nó. - DavidPostill
@ DavidPostill Vâng, đó là tuyệt vời, nhưng bạn sẽ giả định rằng tất cả mọi người khác sẽ có thể làm điều tương tự? Tôi đang tìm kiếm SecureRandomtriển khai, hãy thay thế bằng Cipher để chúng ta có thể tìm ra giải pháp? Không phải ai cũng nghĩ về giải pháp đó. Và tại sao không thay thế bằng Signature, hoặc là Mac? - Maarten Bodewes
@owlstead Không, tôi sẽ không đưa ra giả định đó. Đó chính xác là lý do tại sao tôi gắn cờ là một bản sao có thể ... nó cho phép ai đó tìm ra câu trả lời khác ... bạn có gợi ý tốt hơn về cách xử lý tình huống tương tự trong lần sau nếu gắn cờ là trùng lặp không thích hợp? - DavidPostill


Các câu trả lời:


Ngoài câu trả lời của JB, tôi muốn đề xuất một giải pháp truy vấn thời gian chạy cho các thuật toán có sẵn. Phương pháp này tất nhiên dễ dàng chuyển đổi thành một cho Cipher, SecureRandom, Mac, KeyAgreement, KeyFactory Hay bất cứ thứ gì khác kiểu thuật toán.

Chương trình

import java.security.MessageDigest;
import java.security.Provider;
import java.security.Provider.Service;
import java.security.Security;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class ShowHashAlgorithms {

    private static final void showHashAlgorithms(Provider prov, Class<?> typeClass) {
        String type = typeClass.getSimpleName();

        List<Service> algos = new ArrayList<>();

        Set<Service> services = prov.getServices();
        for (Service service : services) {
            if (service.getType().equalsIgnoreCase(type)) {
                algos.add(service);
            }
        }

        if (!algos.isEmpty()) {
            System.out.printf(" --- Provider %s, version %.2f --- %n", prov.getName(), prov.getVersion());
            for (Service service : algos) {
                String algo = service.getAlgorithm();
                System.out.printf("Algorithm name: \"%s\"%n", algo);


            }
        }

        // --- find aliases (inefficiently)
        Set<Object> keys = prov.keySet();
        for (Object key : keys) {
            final String prefix = "Alg.Alias." + type + ".";
            if (key.toString().startsWith(prefix)) {
                String value = prov.get(key.toString()).toString();
                System.out.printf("Alias: \"%s\" -> \"%s\"%n",
                        key.toString().substring(prefix.length()),
                        value);
            }
        }
    }

    public static void main(String[] args) {
        Provider[] providers = Security.getProviders();
        for (Provider provider : providers) {
            showHashAlgorithms(provider, MessageDigest.class);
        }
    }
}

Sun cung cấp đầu ra

Mã này sẽ tạo ra kết quả sau cho Java 1.8. Lưu ý rằng do một số lỗi cũ của nhà cung cấp API, phiên bản nhà cung cấp chỉ xuất hiện dưới dạng double. Không thể phân biệt giữa phiên bản 1.80 hoặc phiên bản 1.8.0 vì điều này.

Các bí danh bên dưới các triển khai thực tế. Một số bí danh này là Số nhận dạng đối tượng hoặc OID ký hiệu chấm. Các OID này được sử dụng để chỉ các thuật toán từ bên trong các định dạng dữ liệu được mã hóa ASN.1 như chứng chỉ X5.09v3 được sử dụng trong SSL / TLS. Ví dụ, 1.3.14.3.2.26 là ký hiệu chấm cho {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) hashAlgorithmIdentifier(26)} và bí danh cho SHA / SHA-1.

 --- Provider SUN, version 1.80 --- 
Algorithm name: "MD2"
Algorithm name: "MD5"
Algorithm name: "SHA"
Algorithm name: "SHA-224"
Algorithm name: "SHA-256"
Algorithm name: "SHA-384"
Algorithm name: "SHA-512"
Alias: "SHA-1" -> "SHA"
Alias: "OID.1.3.14.3.2.26" -> "SHA"
Alias: "1.3.14.3.2.26" -> "SHA"
Alias: "OID.2.16.840.1.101.3.4.2.4" -> "SHA-224"
Alias: "OID.2.16.840.1.101.3.4.2.3" -> "SHA-512"
Alias: "OID.2.16.840.1.101.3.4.2.2" -> "SHA-384"
Alias: "OID.2.16.840.1.101.3.4.2.1" -> "SHA-256"
Alias: "2.16.840.1.101.3.4.2.4" -> "SHA-224"
Alias: "2.16.840.1.101.3.4.2.3" -> "SHA-512"
Alias: "2.16.840.1.101.3.4.2.2" -> "SHA-384"
Alias: "2.16.840.1.101.3.4.2.1" -> "SHA-256"
Alias: "SHA1" -> "SHA"

Đầu ra của nhà cung cấp Bouncy Castle

Đầu ra cho Lâu đài Bouncy (không được yêu cầu, bao gồm để so sánh):

 --- Provider BC, version 1.51 --- 
Algorithm name: "GOST3411"
Algorithm name: "MD2"
Algorithm name: "MD4"
Algorithm name: "MD5"
Algorithm name: "SHA-1"
Algorithm name: "RIPEMD128"
Algorithm name: "RIPEMD160"
Algorithm name: "RIPEMD256"
Algorithm name: "RIPEMD320"
Algorithm name: "SHA-224"
Algorithm name: "SHA-256"
Algorithm name: "SHA-384"
Algorithm name: "SHA-512"
Algorithm name: "SHA-512/224"
Algorithm name: "SHA-512/256"
Algorithm name: "SHA3-224"
Algorithm name: "SHA3-256"
Algorithm name: "SHA3-384"
Algorithm name: "SHA3-512"
Algorithm name: "Skein-256-128"
Algorithm name: "Skein-256-160"
Algorithm name: "Skein-256-224"
Algorithm name: "Skein-256-256"
Algorithm name: "Skein-512-128"
Algorithm name: "Skein-512-160"
Algorithm name: "Skein-512-224"
Algorithm name: "Skein-512-256"
Algorithm name: "Skein-512-384"
Algorithm name: "Skein-512-512"
Algorithm name: "Skein-1024-384"
Algorithm name: "Skein-1024-512"
Algorithm name: "Skein-1024-1024"
Algorithm name: "SM3"
Algorithm name: "TIGER"
Algorithm name: "WHIRLPOOL"
Alias: "SHA256" -> "SHA-256"
Alias: "SHA224" -> "SHA-224"
Alias: "1.3.36.3.2.3" -> "RIPEMD256"
Alias: "1.3.36.3.2.2" -> "RIPEMD128"
Alias: "1.3.36.3.2.1" -> "RIPEMD160"
Alias: "1.2.156.197.1.401" -> "SM3"
Alias: "SHA512" -> "SHA-512"
Alias: "SHA1" -> "SHA-1"
Alias: "GOST" -> "GOST3411"
Alias: "2.16.840.1.101.3.4.2.6" -> "SHA-512/256"
Alias: "2.16.840.1.101.3.4.2.5" -> "SHA-512/224"
Alias: "2.16.840.1.101.3.4.2.4" -> "SHA-224"
Alias: "2.16.840.1.101.3.4.2.3" -> "SHA-512"
Alias: "2.16.840.1.101.3.4.2.2" -> "SHA-384"
Alias: "2.16.840.1.101.3.4.2.1" -> "SHA-256"
Alias: "1.2.643.2.2.9" -> "GOST3411"
Alias: "1.3.14.3.2.26" -> "SHA-1"
Alias: "SHA512/224" -> "SHA-512/224"
Alias: "GOST-3411" -> "GOST3411"
Alias: "SHA512256" -> "SHA-512/256"
Alias: "SHA384" -> "SHA-384"
Alias: "SM3" -> "SM3"
Alias: "SHA" -> "SHA-1"
Alias: "1.2.840.113549.2.5" -> "MD5"
Alias: "1.2.840.113549.2.4" -> "MD4"
Alias: "1.2.840.113549.2.2" -> "MD2"

23
2017-07-27 16:30



Buồn cười, họ đã thay đổi hệ thống versioning trước khi nhấn 1.10, tôi tự hỏi tại sao: P - Maarten Bodewes
một chút như Windows 9 (... 95/98) ahem tôi có nghĩa là 10: -O - earcam


Tài liệu nói:

Các thuật toán này được mô tả trong phần MessageDigest của Tài liệu Tên Thuật toán Tiêu chuẩn Kiến trúc Mật mã Java

Các tài liệu được liên kết chứa dòng sau, ngay sau bảng nội dung:

Lưu ý: Tài liệu nhà cung cấp Oracle chứa thông tin về nhà cung cấp và thuật toán cụ thể.

tài liệu được liên kết chứa danh sách đầy đủ các thuật toán MessageDigest được cung cấp bởi mỗi nhà cung cấp.


2
2017-07-27 09:27



Cảm ơn @JB Nizet, tôi đã nhận được tài liệu JCA, nhưng sau đó tôi đoán đã không chú ý đủ. Cảm ơn! - mjuarez


Ngoài câu trả lời của Maarten Bodewes: Tôi cần thuật toán như vậy và tôi đã viết một phương pháp, thu thập một danh sách tên được sắp xếp theo tất cả các thuật toán và bí danh có sẵn. Nó sử dụng API luồng của java8. Xin vui lòng, cảm thấy tự do để sử dụng nó bất cứ nơi nào bạn muốn. Chúc mừng.

public static List<String> getAvailableAlgorithms()
{
    final String digestClassName = MessageDigest.class.getSimpleName();
    final String aliasPrefix = "Alg.Alias." + digestClassName + ".";

    return Arrays.stream(getProviders())
        .flatMap(prov -> {
            final Set<String> algorithms = new HashSet<>(0);

            prov.getServices().stream()
                .filter(s -> digestClassName.equalsIgnoreCase(s.getType()))
                .map(Service::getAlgorithm)
                .collect(Collectors.toCollection(() -> algorithms));

            prov.keySet().stream()
                .map(Object::toString)
                .filter(k -> k.startsWith(aliasPrefix))
                .map(k -> String.format("\"%s\" -> \"%s\"", k.substring(aliasPrefix.length()), prov.get(k).toString()))
                .collect(Collectors.toCollection(() -> algorithms));

            return algorithms.stream();
        })
        .sorted(String::compareTo)
        .collect(Collectors.toList());
}

2
2018-06-02 11:11