Scala中Base64解码报错:Illegal base64 character 5c 求助
问题与解决:Base64私钥解码失败异常处理
问题描述
1. 待处理的Base64私钥(部分字符已移除)
MIIEpAIBAAKCAQEAtp/Uo28kOjROL50aajnpK25CJoVoic2bqqu6OS2baWWD9fT2 ESqq8mbFxYN3O7JXbs+74YpTdg1jSUALOz9zj/H2eCF71QYvoHmdoi0iiQuy3gS1 6YczVvBvinSwfEnO6Wi/Xx6AC8urdreUR0c+5cNNSqI9oyrwA4m/XrFwR6ptT9oy yahrVJdjA2Wdf+O4/0lW+jrMw+s Qptfu4QslKhDnRUFu4ALqm3nypD/ojGjFCEl5poiBMMztqIpE7f9t+IBY/zJbOBP I+sHVgwH/pJbi0CqIiDNIEiXsLDERTldzvA4DQIDAQABAoIBAFu+IVlVLRLcUebT eoCgxQUfZ7XoUSLhGnF7wZqV0bv51ngJ7k+jaqtJe9MEfzKLHic5zn24OsNUaGtU 9A94ibpnaFTjJU1XxTdNwSXGnNHSAbJNFYHSfLURJkec5Uga4Aobp//F17eVQnbq NGA2Z1+PZFW4+VPt7xMn8O5GH0ywdFhj4PI+z+UT0j1ezebjzDM2FoKwjfvA0wHg bZuyFjb0EBNsaW9y1quh2sSaHAFATYoTLG3ArM/Ue4Fr/Qom0/5N3uusifMdWEcA w7/yiI9D7Q4XsqoZ9gqAhXOcWgJmjvsx66zqUbArw/HmqIy5/vQfoZV78ux2iyZP O9n68AECgYEA6GP5Ns8Zfgm9Y7J5OxjgGwwQYZziKGysnYIe2N6y9jbjXdjsTtTH JKeeM+eHL3Mq2yrYj9m3bACE/uNQ/4o+V+hvVQusN+bMpY5YGHm4KiGL0ieNYs3B A6LLGni7itMY5SC9g7Rm5tlAvUmv38NTKcS47Wz1YKrnhId4x5eWPAECgYEAyS2J B8/6+C3jowJWJoguLKWWeEF5sPe9IWTqWxoUuJRLaSoKTWl0VKPB60DZZEpbPh2n uQlfaRnbt/YZBIeBqnrZzqiO5iTDDtw8zOa0B+DLv9OX9I4dzbQ+PtH/CRH6cDst hrMUUqW5K56za+gH8iiyvBAxjJG11QctUdIh0GZdgdhkW2YFYO ClWYyCaqhfWOeJOjtQNgBGleXRF/4EJRNJP8wTuXVK+Vnrynq6dk2tyb77TyLRTZ F5ZsrQKBgQCaNIpP1tGYpYTfFny5xQ8aY5e6Bd3/aC5Ays8wYb8oAPYwH9AeqWY2 sistzq9ARRbvwXzl45HzRKYoWVd1D0D5yOwxFOW++VD3luXH1UpEB1bvxHrpIwbD gg9jhO9K1yri6JGA5ENx5InrvKsqodP/llszVJysBlUeAcwMo2gjNA==
2. 用于转换的Scala代码
def convertToBase64(privateKeyB64: String) = { val bytesArray = java.util.Base64.getDecoder.decode(privateKeyB64.replaceAll("\\r\\n|\\r|\\n", "")) import java.security.KeyFactory import java.security.spec.PKCS8EncodedKeySpec val spec = new PKCS8EncodedKeySpec(bytesArray) // create key from spec val keyFactory = KeyFactory.getInstance("RSA") keyFactory.generatePrivate(spec) }
3. 执行时抛出的异常
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character 5c
用户疑问:不清楚该错误的具体含义,想了解Base64中的5c指代什么,以及如何解决该问题。
问题解答
1. 5c的具体含义
5c是字符的十六进制ASCII码值,对应的实际字符是反斜杠\。
Base64编码的合法字符范围是固定的:A-Z、a-z、0-9、+、/,以及用于补位的=。反斜杠不在这个范围内,所以当解码器遇到它时,就会抛出"非法Base64字符"的异常。
2. 解决方法
(1)修改字符串清理逻辑
你的代码已经处理了换行符,但没处理可能存在的反斜杠。需要在移除换行的同时,额外移除反斜杠:
def convertToBase64(privateKeyB64: String) = { // 移除换行符和反斜杠 val cleanedKey = privateKeyB64.replaceAll("\\r\\n|\\r|\\n|\\\\", "") val bytesArray = java.util.Base64.getDecoder.decode(cleanedKey) import java.security.KeyFactory import java.security.spec.PKCS8EncodedKeySpec val spec = new PKCS8EncodedKeySpec(bytesArray) val keyFactory = KeyFactory.getInstance("RSA") keyFactory.generatePrivate(spec) }
(2)检查私钥来源
出现反斜杠通常是因为私钥被错误转义了:
- 比如从JSON字符串复制时,原始的
/被转义成了\/,导致多出反斜杠 - 或者在代码中定义字符串时,错误地添加了转义符
建议确认私钥的原始来源,确保拿到的是标准的PKCS#8格式Base64编码,没有多余的非合法字符。
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

