Yan*_*n39 4 c# java base64 unsigned sha1
我试图在C#和Java中散列值(SHA1),然后返回base64表示.我得到2个不同的结果.
我知道这是因为Java使用有符号字节而C#没有.
C#版本:
static public string toSHA1(string toEncrypt)
{
return toSHA1(toEncrypt, new UTF8Encoding());
}
static public string toSHA1(string toEncrypt, Encoding encoding)
{
String salt = "fE4wd#u*d9b9kdKszgè02ep5à4qZa!éi6";
SHA256Managed sha256hasher = new SHA256Managed();
byte[] hashedDataBytes = sha256hasher.ComputeHash(encoding.GetBytes(toEncrypt + salt));
return Convert.ToBase64String(hashedDataBytes);
}
Run Code Online (Sandbox Code Playgroud)
Java版本:
public static String toSHA1(String toEncrypt) {
return toSHA1(toEncrypt, "UTF-8");
}
public static String toSHA1(String toEncrypt, String encoding) {
String salt = "fE4wd#u*d9b9kdKszgè02ep5à4qZa!éi6";
String res = null;
toEncrypt = toEncrypt + salt;
try {
byte[] dataBytes = toEncrypt.getBytes(encoding);
MessageDigest md = MessageDigest.getInstance("SHA-1");
res = Base64.encodeBytes(md.digest(dataBytes));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
我无法找到使用Java获得正确base64结果的解决方案.
将有符号值转换为无符号值会强制使用int数据类型,但只要我将其放入byte数据类型中,我就会收到带符号的字节...
Base64.encodeBytes正在等待一个byte数组,所以有什么办法可以将无符号 byte数组传递给这个方法吗?我该怎么处理这个int阵列?:
int[] dataInt = new int[dataBytes.length];
// signed to unsigned
for (int i=0; i<dataBytes.length; i++)
{
dataInt[i] = (dataBytes[i] & 0xFF);
}
Run Code Online (Sandbox Code Playgroud)
我无法修改C#版本,我必须调整Java版本才能得到相同的结果.
问题很简单......来自你的C#代码:
SHA256Managed sha256hasher = new SHA256Managed()
Run Code Online (Sandbox Code Playgroud)
SHA-256!= SHA-1.SHA1在C#中使用该类,或者在Java中也使用SHA-256.由于您显然无法更改C#代码,因此您应该更改Java:
MessageDigest md = MessageDigest.getInstance("SHA-256");
Run Code Online (Sandbox Code Playgroud)
完成后,base64编码的数据应该在两个平台上都相同.尽管字节是用Java签名的,但base64编码器将它们视为无符号......基本上它们只对这些位感兴趣.
我还强烈建议您在源代码中用ASCII表示您的salt,使用\uxxxx转义为任何非ASCII字符.这将防止因使用错误编码进行编译而导致的问题.
| 归档时间: |
|
| 查看次数: |
3709 次 |
| 最近记录: |