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() ) ); } }