57 lines
1.3 KiB
Plaintext
57 lines
1.3 KiB
Plaintext
component
|
|
output = false
|
|
hint = "Генерирует случайные токены с помощью Java SecureRandom."
|
|
{
|
|
|
|
public any function init() {
|
|
generator = createObject( "java", "java.security.SecureRandom" )
|
|
.getInstance(
|
|
javaCast( "string", "SHA1PRNG" ),
|
|
javaCast( "string", "SUN" )
|
|
)
|
|
;
|
|
generator.nextBytes( charsetDecode( " ", "utf-8" ) );
|
|
reseedAt = getNextReseedAt();
|
|
|
|
return( this );
|
|
}
|
|
|
|
public string function nextToken( numeric byteCount = 32 ) {
|
|
if ( now() >= reseedAt ) {
|
|
lock
|
|
name = "TokenGenerator.reseedCheck"
|
|
type = "exclusive"
|
|
timeout = 1
|
|
throwOnTimeout = false
|
|
{
|
|
if ( now() >= reseedAt ) {
|
|
|
|
reseedAt = getNextReseedAt();
|
|
generator.setSeed( generator.generateSeed( javaCast( "int", 32 ) ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
var byteBuffer = charsetDecode( repeatString( " ", byteCount ), "utf-8" );
|
|
|
|
generator.nextBytes( byteBuffer );
|
|
|
|
return( encodeBytes( byteBuffer ) );
|
|
}
|
|
|
|
private string function encodeBytes( required binary bytes ) {
|
|
|
|
var token = binaryEncode( bytes, "base64" );
|
|
token = replace( token, "+", "a", "all" );
|
|
token = replace( token, "/", "b", "all" );
|
|
token = replace( token, "=", "c", "all" );
|
|
|
|
return( token );
|
|
}
|
|
|
|
private date function getNextReseedAt() {
|
|
|
|
return( dateAdd( "h", 1, now() ) );
|
|
}
|
|
|
|
} |