Skip to main content

Podpis NRB

Razem z numerem rachunku bankowego przekazywany jest klientowi podpis zapewniający wiarygodność oraz potwierdzenie źródła pochodzenia numeru. Podpis powinien być zweryfikowany i zachowany po stronie klienta wraz z wersją klucza zwróconą razem z podpisem z API.

Pobranie klucza publicznego

Aby zweryfikować podpis należy pobrać klucz publiczny do podpisu, przy pomocy GET /api/public-keys/signature. W odpowiedzi otrzymamy wersję oraz klucz, które należy wykorzystać do weryfikacji podpisu.

Request
GET /api/public-keys/signature HTTP/1.1
Host: <api_host>
Authorization: Bearer <auth_token>
Response
{
"version": "v1",
"key": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwH+lDJP0o3qxWNR6L6uY\nYpwXt7bEY6XIIt7ZTOK1wwgpFjhYAaTzZAbPodCWFQ9cSipliQLEBER9Q3qwnUnr\nUrn1ZEuKjC4kCNcZfHpXSzD9RnfTz2YDsB0JIpagblcpVlLXtE5ycLgB+D2DYSEU\n5yZSpHqYAmKCJyE7VtA4H9Ae3Fr7yOYQ2ySMmUwzIocx3HMxJhpkKj96RMvVOkg+\nd58DNQWAtjyaBV0X+9cMP15CrzntfB88f8O81/tGowAds21a/nYoAS4WdB77p7wR\n7PqvC6lyaxAdspUkcWUPOpyyxiHU2f86bwbwN7/gs+q5kDKxnnR1+b7QyofkzZWl\nBDdse+8IKliyE13rV4zjrT/i75YE2M03Qb47mYb6UcJ1s9Pye/7JCNa/gudLjxYw\nmGeSfIGVTSnSE/lBScfLkSToUT7rS0SnHZW5SHAsfZTmkk9tEX2MmfAQP4XxWw4O\nUJd7u18heBjex+kCt/N/cK7t7aecRsS+QbqeMg5agCLfx9ZEV+iwVkpC4nDZvnHk\nlRsZrzN5KMtWQxMO65pIoZeHYCo5XLvn7HZHu3WHpSO1KkQiN4IoUliUDReLx1Wi\na0bJiQHzO5f7iYZwBTJPDRYeAB4BZ+C5VZpx8Jn10RnEyVf8jqWg5p9ROWT6OC3h\n4doRZdP12EGJo0TVds75eVECAwEAAQ==\n-----END PUBLIC KEY-----\n"
}

Z klucza należy usunąć oznaczenie początku oraz końca, a także znaki nowej linii.

Java
public PublicKey getPublicKey(String publicKey) {
var base64EncodedKey = publicKey.replaceAll("-----END PUBLIC KEY-----", "")
.replaceAll("-----BEGIN PUBLIC KEY-----", "")
.replaceAll("\n", "")
byte[] decodedKey = Base64.getDecoder().decode(base64EncodedKey)
X509EncodedKeySpec spec = new X509EncodedKeySpec(decodedKey)
KeyFactory keyFactory = KeyFactory.getInstance("RSA")
return keyFactory.generatePublic(spec)

}

Weryfikacja podpisu

Podpis budowany jest z liabilityId oraz nrb połączonych w jeden ciag znaków. Generowanie podpisu odbywa się przy użyciu protokołu RSA, z funkcją skrótu SHA256 oraz dopełnieniem PKCS#1 v1.5, następnie wygenerowany podpis jest kodowany do base64 i wraz z wersją przekazywany do klienta. Wersja klucza użyta do zaszyfrowania podanawana jest w formie przedrostka z literą v na początku. Po przedrostku wersji występuje separator :, a następnie treść podpisu.

v1:PJBn7xrg/wtayyncqHfJ1Kem4rJP1FAqKnTYZU9HZeuvryBb3uJgmJnuAeZnfilo3mPrA+FuXBcDWxTp+PPGAUeoex+9964O4rQ2v27EGdqsofrqYvSsGLBvvh4YHYZJvpNhIqTUwgabfz1SQWmmO2icY+x14GPeyxAlRnIzY+tlrGcRThK+WFmxiM99vD4R1UtYO0OmTg5cRDfzAb0EJRjYstjdc6lFJambYFuHOT+nmcMQyF2UgPFoislD00BkJZQFxIUKQ6/rHdNOaOJt0PVzOyOQDC6HCN2Z5JKiBtQgQtLyW5xFKEr/B8i5NGNAGvTBLovMcWY25zDll0pu3GQzt5kisi/ceAdSuLs9SBDl/J59KArBZyPc1mhg3OSjwEWk0ZVVnD+DQio6jv4JqvlSuagxhfxaeeAEoUxjcZ1c/sWjnrK6kmdEuygXw/jgiiOGhcqebnDwbtLX2t4qKq2a9Rzn/zb9nGf3+LgFyR56R96TrGzDEmoUtp+0M165SREueFyKBlC6EyDsJbFe3l3ndD6Z6bjVgtf/o0/LbW6qR5lkP6yGlViDl+mbuspk4QlxHOxup1NFJY/OPR11GrZ/EeezhCb968TVs9VfhJyx/P+2lc8MhRzGAvp2UeHMrahZEwkW5GxtGIPHlufvEsQBgfsspFtIH+ySblovxYE=

Aby zweryfikować podpis można wykorzystać poniższy kod. Parametr podpisu powinien zostać przekazany bez przedrostka wersji oraz sepraratora.

Java
public boolean verify(String base64Signature, String liabiltyId, String nrb, PublicKey publickKey) {
var text = liabilityId + nrb;
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey)
signature.update(text.getBytes("UTF-8"))
var nrbSignature = Base64.getDecoder().decode(base64Signature)
return signature.verify(nrbSignature)
}