Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和Java之间始终相等的简单哈希_C#_Java_Hash - Fatal编程技术网

C#和Java之间始终相等的简单哈希

C#和Java之间始终相等的简单哈希,c#,java,hash,C#,Java,Hash,我有一个C#WebService和一个(Java)Android应用程序。有没有一个简单的哈希函数可以在这两种语言之间产生相同的结果?最简单的C#散列是String.GetHashCode(),但我无法在Java中复制它。最简单的Java哈希一点也不简单。我不知道我是否能在C中完全复制它 如果相关的话,我会在通过互联网发送之前对密码进行哈希运算。我目前正在使用Encode64,但这显然不安全,因为我们可以反转它 编辑:好的,我决定使用SHA256。如果其他人需要快速解决方案,下面是我使用的代码

我有一个C#WebService和一个(Java)Android应用程序。有没有一个简单的哈希函数可以在这两种语言之间产生相同的结果?最简单的C#散列是String.GetHashCode(),但我无法在Java中复制它。最简单的Java哈希一点也不简单。我不知道我是否能在C中完全复制它

如果相关的话,我会在通过互联网发送之前对密码进行哈希运算。我目前正在使用Encode64,但这显然不安全,因为我们可以反转它


编辑:好的,我决定使用SHA256。如果其他人需要快速解决方案,下面是我使用的代码,考虑到我希望C#和Java都能输出完全相同的字符串,我需要最简单的解决方案

Java

public String Hash(String s)
{
    StringBuffer sb = new StringBuffer();
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(s.getBytes());
        byte byteData[] = md.digest();
        for (int i = 0; i < byteData.length; i++) {
            sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16)
                    .substring(1));
        }
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return sb.toString();
}

谢谢大家!:)

如果需要安全性,应该尝试加密。否则,将有一个内置的哈希算法,如MD5。这应该在两种密码之间可靠地保持一致。使用标准算法,如MD5或SHA256,在任何平台上都会产生相同的结果(如果正确实现),但您可能需要考虑在通过网络发送密码之前,这是否真的是“加密”密码的最佳方法。

首先,由
String.GetHashCode()
String.hashCode()
实现的哈希类型并不是为这种类型的事情而设计的。首先,它们只会散列到32,但不会散列到一个数字(至少在Java中是这样),因此存在很大的冲突风险。在这种情况下,如果两个不同的密码映射到同一个哈希。。。然后有人有1/2^32的几率接受随机选择的密码。(另一方面,如果坏人能够截获32位哈希值以获得有效密码,那么他们在猜测原始密码时就有了很大的优势!)

其次,发送加密散列(如MD5、SHA-256等生成的)可能无法解决安全问题。。。除非您通过SSL或其他方式发送哈希。当然,坏人将无法恢复原始密码,但他们可以拦截并在“重播”攻击中使用哈希。(有很多方法可以解决这一问题,但它们要么需要共享密钥,要么需要使用公钥/私钥加密……如果希望安全,您必须知道自己在做什么。)

简而言之,您需要与具有可靠安全专业知识的人讨论整个问题和建议的解决方案


如果您真的认为这不是一个安全问题,那么MD5哈希就可以了。但不要说你没有被警告


(但不要使用简单的32位哈希代码,因为它几乎比base64更安全。)

您可以在Java中使用以下代码,它可以与C的代码相匹配#

公共静态字符串getEncryptedPassword(字符串clearTextPassword)抛出NoSuchAlgorithmException{
MessageDigest md=MessageDigest.getInstance(“SHA-256”);
md.update(clearTextPassword.getBytes(StandardCharsets.UTF_8));
字节[]摘要=md.digest();
字符串十六进制=String.format(“%064x”,新的BigInteger(1,摘要));
String st=新字符串(hex.toUpperCase());
对于(int i=2;i<(十六进制长度()+十六进制长度()/2)-1;){
st=新的StringBuffer(st).insert(i,“-”).toString();
i=i+3;
}
返回st;
}

+1。MD5比base64:)要好得多。但是,是的,SHA-256会更好(C#和Java中的SHA-256-)如何使用一些库/现有包中的公共哈希函数对字符串进行哈希处理?AES。不要重新发明轮子。确保你不只是通过互联网发送普通散列。这并不比以明文形式发送密码好,因为有人可以简单地捕获并重播散列传输以登录。我知道我不应该使用“安全”这个词。。实际上,我是在保护我客户的密码,以防我自己的员工,而不是黑客。我认为Java中最简单的字符串散列也是
string.hashCode()
,只要看看这两个,我就会说Java版本比C版本简单。Java中计算哈希代码的标准方法非常简单,只需取一些素数(通常为31),然后将对象的值作为
String放在一起。hashCode()
描述:
s[0]*31^(n-1)+s[1]*31^(n-2)+……+s[n-1]
-应该很容易在C#中复制。但是,由于您是通过网络发送密码,我支持使用一些SHA实现的建议。好的,首先,我没有对核反应堆进行编程(例如,我/没有/有安全问题)。我要求一个简单的哈希,因为安全性不是一个问题。我只是不希望我自己的员工在DB的PasswordHash字段中编写Decode64脚本,然后发现大多数人在其他帐户中使用相同的密码。如果有人对我的服务使用重播攻击,我会非常高兴,他们甚至会打扰我。处理密码需要良好的加密。您的员工将回收密码,正确保管密码是您的责任。你现在可能没有安全问题,但最终你会的。我有很大的机会遇到这样的事情:我只是没有时间调试。这就是为什么我要找一个简单的散列。我很好奇为什么你认为你有很大的机会这么做?对于这个问题,公认的答案是一个简单的解决方案——确保明确说明从字符串转换为
字节[]
时使用的编码。
public static string Hash(String s)
{
    HashAlgorithm Hasher = new SHA256CryptoServiceProvider();
    byte[] strBytes = Encoding.UTF8.GetBytes(s);
    byte[] strHash = Hasher.ComputeHash(strBytes);
    return BitConverter.ToString(strHash).Replace("-","").ToLowerInvariant().Trim();
}
public static String getEncryptedPassword(String clearTextPassword) throws NoSuchAlgorithmException{

    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(clearTextPassword.getBytes(StandardCharsets.UTF_8));
    byte[] digest = md.digest();
    String hex = String.format("%064x", new BigInteger(1, digest));
    String st = new String(hex.toUpperCase());
    for (int i = 2; i < (hex.length() + hex.length() / 2) - 1 ;) {
        st = new StringBuffer(st).insert(i, "-").toString();
            i = i + 3;        
    }
    return st ; 

}