繁体   English   中英

客户端和服务器中为相同值计算的不同sha

[英]Different sha calculated in client and server for the same value

我对此有疑问。

我创建了两个程序,一个客户端和一个服务器,它们通过Java中的套接字进行通信。 现在的问题是,当我从服务器套接字上的InputStream接收到一个对象时,我必须采用接收到的值的SHA384,并检查以确保它与客户端计算的SHA384相同。 我在调试模式下检查了接收到的值是否与发送的值相同,但是当我使用此值的SHA384时,将获得与客户端不同的哈希值。

为什么? 客户端是一个android应用程序,服务器端是简单的Java。

这是我用来创建哈希的函数

public enum SECURE_HASH_TYPE{MD2, MD5, SHA, SHA256, SHA384, SHA512}

private static String SecureHashToString(SECURE_HASH_TYPE hash){

    String hashString = "SHA-256";                              //default value

    if(hash != null){
        switch(hash){
            case MD2:
                hashString = "MD2";
                break;

            case MD5:
                hashString = "MD5";
                break;

            case SHA:
                hashString = "SHA";
                break;

            case SHA256:
                hashString = "SHA-256";
                break;

            case SHA384:
                hashString = "SHA-384";
                break;

            case SHA512:
                hashString = "SHA-512";
                break;

            default:
                hashString = "SHA-512";
                break;
        }
    }

    return hashString;
}



public static byte[] getByteHashCode(Object obj, SECURE_HASH_TYPE hashing){
    if(obj == null)
        return null;

    MessageDigest md;
    byte[] byteData = null;

    try {
        md = MessageDigest.getInstance(SecureHashToString(hashing));

        md.update(ObjectUtil.toByteArray(obj));

        byteData = md.digest();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

    return byteData;
}


 public static byte[] toByteArray(Object obj){
    if(obj == null)
        return null;

    if(obj instanceof String)
        return ((String)obj).getBytes();

    ByteArrayOutputStream baos = null;
    ObjectOutputStream oos = null;
    byte[] byte_array = null;

    try{
        baos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(baos);

        oos.writeObject(obj);
        byte_array = baos.toByteArray();

        baos.close();
        oos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return byte_array;
}

次要问题:对于Strings ,您依赖于getBytes() ,它使用系统的默认字符集。 如果客户端和服务器使用不同的默认字符集,则结果可能会有所不同。 您应该改用getBytes(String) ,并指定适当的字符集名称:

return ((String) obj).getBytes('UTF-8');

但是主要的问题是您使用ObjectOutputStream.writeObject()为非字符串创建字节序列。 没有特别的理由期望该方法在应用于任何两个不同的对象时会产生逐字节的相同字节序列,即使这些对象在某种意义上是等效的。 对于某些类的对象,您可能会得到该结果,但是我绝对可以编写一个其实例将不具有该属性的类。

哦,如果您给它传递了一个不是Serializable的对象,您的方法将会中断。

我不知道有什么办法可以在您尝试做的一般性水平上做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM