如何在java中对mpesa密码进行哈希和编码
我正试图动态生成一个密码,以便将每个api请求发送到mpesa apis。根据文档,我需要首先连接提供的密钥与时间戳和商人ID,然后做一个sha256来获得一个散列密码,然后我应该编码到基础64然而,在Java中这样做返回一个错误的编码字符串,而类似的过程和代码在PHP中工作,我可能会在哪里出错?如何在java中对mpesa密码进行哈希和编码
import org.apache.commons.codec.binary.Base64;
import org.apache.cxf.headers.Header;
import org.apache.cxf.jaxb.JAXBDataBinding;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
public class CheckoutHeaderBuilder {
public static Header buildHeader(String merchantId, String passKey, String timestamp) throws JAXBException, NoSuchAlgorithmException, UnsupportedEncodingException {
String hashedEncodedPass = Base64.encodeBase64String(MessageDigest.getInstance("SHA-256").digest((merchantId + passKey + timestamp).getBytes("utf-8")));
List<Header> headers = new ArrayList<>();
CheckOutHeader checkOutHeader = new CheckOutHeader();
checkOutHeader.setTIMESTAMP(timestamp);
checkOutHeader.setMERCHANTID(merchantId);
checkOutHeader.setPASSWORD(hashedEncodedPass);
return new Header(new QName("tns:ns", "CheckOutHeader"), checkOutHeader, new JAXBDataBinding(CheckOutHeader.class));
}
}
嗨Japheth Ongeri Inkalimeva,你不必使用SHA256加密。在发送Lipa na M-Pesa Online Payment API请求时,您可能无需重新设置新密码。
我已经修改了您的代码以删除SHA256加密。
import org.apache.commons.codec.binary.Base64;
import org.apache.cxf.headers.Header;
import org.apache.cxf.jaxb.JAXBDataBinding;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
public class CheckoutHeaderBuilder {
public static Header buildHeader(String merchantId, String passKey, String timestamp) throws JAXBException, NoSuchAlgorithmException, UnsupportedEncodingException {
String hashedEncodedPass = Base64.encodeBase64String((merchantId + passKey + timestamp).getBytes("utf-8"));
List<Header> headers = new ArrayList<>();
CheckOutHeader checkOutHeader = new CheckOutHeader();
checkOutHeader.setTIMESTAMP(timestamp);
checkOutHeader.setMERCHANTID(merchantId);
checkOutHeader.setPASSWORD(hashedEncodedPass);
return new Header(new QName("tns:ns", "CheckOutHeader"), checkOutHeader, new JAXBDataBinding(CheckOutHeader.class));
}
}
这是行不通的,它相当于以明文发送密码(只用base64编码)而不用散列,这是非常不安全的。这就是文档特别要求sha256哈希的原因。 –
你是否使用暴露在http://developer.safaricom.co.ke上的API? – Beliot
例编码SHA256
import java.nio.charset.StandardCharsets;
import com.google.common.hash.Hashing;
String password = “123456”;
Hashing.sha256().hashString(password, StandardCharsets.UTF_8).toString();
希望能帮助你
@zaph指出,我已经编辑了标题相应 –