将 SHA1 从 c# 转换为 android
Converting SHA1 from c# to android
我需要使用此 C# 代码并在 android 中生成相同的散列:
string result = "2-" + Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(Encoding.Unicode.GetBytes(password)));
我试图花几个小时完成这项工作,但它仍在散列不同的代码。
感谢您的回答。
开始吧:
try {
String password = "qwkld67U";
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.update(password.getBytes("UTF-16LE"));
String result = "2-" + Base64.encodeToString(sha1.digest(), Base64.DEFAULT);
Log.i("SHA1", result);
} catch (Exception e) {
throw new RuntimeException(e);
}
输出为:
I/SHA1: 2-BePLL+2eth1YOoIcbA5sfzD8Yuw=
大多数人都弄错了字符串编码。 Encoding.Unicode
在.NET中是一种没有字节顺序标记的UTF-16编码。 Java 等价于 UTF-16LE
(而不仅仅是 UTF-16
,它在开头有一个字节顺序标记)。
以及关于安全反模式。我知道你不在乎。但这可能比我在评论中怀疑的还要糟糕(不加盐的散列)。如果您将散列密码传输到服务器并在服务器上将其与散列密码进行比较,则完全违背了首先对密码进行散列处理的目的。通过加密连接传输明文密码比传输散列密码要好得多。让负责安全设计的人知道。
我需要使用此 C# 代码并在 android 中生成相同的散列:
string result = "2-" + Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(Encoding.Unicode.GetBytes(password)));
我试图花几个小时完成这项工作,但它仍在散列不同的代码。 感谢您的回答。
开始吧:
try {
String password = "qwkld67U";
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.update(password.getBytes("UTF-16LE"));
String result = "2-" + Base64.encodeToString(sha1.digest(), Base64.DEFAULT);
Log.i("SHA1", result);
} catch (Exception e) {
throw new RuntimeException(e);
}
输出为:
I/SHA1: 2-BePLL+2eth1YOoIcbA5sfzD8Yuw=
大多数人都弄错了字符串编码。 Encoding.Unicode
在.NET中是一种没有字节顺序标记的UTF-16编码。 Java 等价于 UTF-16LE
(而不仅仅是 UTF-16
,它在开头有一个字节顺序标记)。
以及关于安全反模式。我知道你不在乎。但这可能比我在评论中怀疑的还要糟糕(不加盐的散列)。如果您将散列密码传输到服务器并在服务器上将其与散列密码进行比较,则完全违背了首先对密码进行散列处理的目的。通过加密连接传输明文密码比传输散列密码要好得多。让负责安全设计的人知道。