(feature): add otp secret generation
This commit is contained in:
parent
885f3d80a4
commit
e8d87d8700
@ -1,4 +1,5 @@
|
|||||||
using MaksIT.Core.Security;
|
using MaksIT.Core.Extensions;
|
||||||
|
using MaksIT.Core.Security;
|
||||||
using System;
|
using System;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
@ -65,5 +66,17 @@ namespace MaksIT.Core.Tests.Security {
|
|||||||
// Assert
|
// Assert
|
||||||
Assert.True(timestep >= 0);
|
Assert.True(timestep >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GenerateSecret_ReturnsValidBase32String() {
|
||||||
|
// Act
|
||||||
|
var secret = TotpGenerator.GenerateSecret();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(string.IsNullOrEmpty(secret));
|
||||||
|
Assert.True(secret.IsBase32String());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -262,5 +262,15 @@ namespace MaksIT.Core.Extensions {
|
|||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsBase32String(this string input) {
|
||||||
|
// Base32 characters are A-Z and 2-7
|
||||||
|
foreach (char c in input) {
|
||||||
|
if (!((c >= 'A' && c <= 'Z') || (c >= '2' && c <= '7'))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<!-- NuGet package metadata -->
|
<!-- NuGet package metadata -->
|
||||||
<PackageId>MaksIT.Core</PackageId>
|
<PackageId>MaksIT.Core</PackageId>
|
||||||
<Version>1.0.6</Version>
|
<Version>1.0.7</Version>
|
||||||
<Authors>Maksym Sadovnychyy</Authors>
|
<Authors>Maksym Sadovnychyy</Authors>
|
||||||
<Company>MAKS-IT</Company>
|
<Company>MAKS-IT</Company>
|
||||||
<Product>MaksIT.Core</Product>
|
<Product>MaksIT.Core</Product>
|
||||||
|
|||||||
@ -59,5 +59,16 @@ public static class TotpGenerator {
|
|||||||
var unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
var unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||||
return unixTimestamp / Timestep;
|
return unixTimestamp / Timestep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static string GenerateSecret() {
|
||||||
|
// Example of generating a 32-character base32 secret for TOTP
|
||||||
|
var random = new byte[20];
|
||||||
|
using (var rng = RandomNumberGenerator.Create()) {
|
||||||
|
rng.GetBytes(random);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Base32Encoder.Encode(random); // You can use a Base32 encoder to generate the secret.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user