从CLI生成base64编码的哈希以匹配Java

我有一个java代码库,它从一个字符串生成一个URL安全的base64编码哈希,并想知道是否/如何使用linux命令行工具。 我猜测我在做什么的问题是字符集/编码或将字符串转换为字节数组。 Java代码:

MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digest = md.digest("testString".getBytes()); // ^^ this is where the difference is? String b64url = Base64.encodeBase64URLSafeString(digest); // b64url: Ss8LOdnEdmcJo2ifVTrAGrVQVF_6RUTfwLLOqC-6AqM 

命令行:

 echo testString | sha256sum | cut -d" " -f1 | base64 # NDgxOGEyY2JkODYwOTY1NjJkODFmYzIwNmQ3ZTYyNWVlNGFjMTU5MmViNTc0MjQwMDQ4OTIzOTBl # MDQzZTNlYwo= 

是否可以通过cli工具生成base64编码的sha256?

你是base64编码一个hex字符串,而不是哈希的字节值,它相当于:

 MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digest = md.digest("testString".getBytes()); // Missing charset String hex = Hex.encodeHexString(digest); String base64 = Base64.encodeBase64(hex.getBytes()); 

您可以使用StringBuilder将hex转换为有意义的字符串:

 MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digest = md.digest("testString".getBytes()); StringBuilder sb = new StringBuuilder(); for (byte b : digest) { sb.append(Integer.toHexString(b & 0xff)); } String base64 = Base64.encodeBase64(sb.toString()); 

结合不包括echo命令中的换行符,可以在这里工作……