38 lines
1.9 KiB
C#
38 lines
1.9 KiB
C#
using System.Security.Cryptography;
|
|
using System.Text;
|
|
|
|
namespace AyCode.Services.Nav;
|
|
|
|
/// <summary>
|
|
/// NAV authentikációs hash-ek. Az algoritmus a NAV-rendszereken közös (SHA-512, nagybetűs hex), ezért a base
|
|
/// rétegben él. (EKÁER 2.2 <c>UserHeaderType</c> doksija: <c>passwordHash</c> = SHA-512(jelszó) UPPER;
|
|
/// <c>requestSignature</c> = SHA-512(requestId + timestamp[yyyyMMddHHmmss] + aláírókulcs) UPPER.)
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Az Online Számla a <c>requestSignature</c>-höz SHA3-512-t használ — ha az kell, a <see cref="HashAlgorithm"/>
|
|
/// override-olható egy jövőbeli paraméterrel. Jelenleg az EKÁER SHA-512-jét implementálja.
|
|
/// </remarks>
|
|
public static class NavAuthHelper
|
|
{
|
|
/// <summary>A signature timestamp-részének formátuma (NAV: év-hó-nap-óra-perc-mp, elválasztó nélkül).</summary>
|
|
public const string SignatureTimestampFormat = "yyyyMMddHHmmss";
|
|
|
|
/// <summary>SHA-512(<paramref name="password"/>) → 128 karakteres nagybetűs hex.</summary>
|
|
public static string ComputePasswordHash(string password)
|
|
=> Sha512UpperHex(password);
|
|
|
|
/// <summary>
|
|
/// SHA-512(<c>requestId</c> + <c>timestamp</c>(UTC)[yyyyMMddHHmmss] + <c>signingKey</c>) → nagybetűs hex.
|
|
/// A NAV az aláíráshoz a header-timestamp <b>UTC-megfelelőjét</b> várja, ezért <see cref="DateTime.ToUniversalTime"/>.
|
|
/// (Hivatalos teszt-vektor: <c>Nav/docs/EKAER_INTERFACE.md</c>.)
|
|
/// </summary>
|
|
public static string ComputeRequestSignature(string requestId, DateTime timestamp, string signingKey)
|
|
=> Sha512UpperHex(requestId + timestamp.ToUniversalTime().ToString(SignatureTimestampFormat) + signingKey);
|
|
|
|
private static string Sha512UpperHex(string input)
|
|
{
|
|
var hash = SHA512.HashData(Encoding.UTF8.GetBytes(input));
|
|
return Convert.ToHexString(hash); // Convert.ToHexString → nagybetűs hex
|
|
}
|
|
}
|