Some ways I've seen it done
1) Store (at a min) all secrets in something like aws secrets manager, hashicorp vault or other. When an application boots up it using a tool like consul-template or just a vendor specific SDK to authenticate against the "secrets" store's APIs, and pull down the secrets it needs on boot (render configs into templates or just hold in mem). The app obviously needs one "bootstrap secret" to be able to auth against the secret store on boot, this can be generated at deploy time w/ a limited life (time/uses) and provided to the application via another secure mechanism such as a kubernetes secret via the filesystem or docker secrets (swarm), etc etc. (i.e. it can be used In this case to boot the app you are only passing one bootstrap token/secret that it can then use to get everything else it needs. (the app also needs to renew this token if you want to be able to horizontally scale etc). You can also use this mechanism to "template" all of your configs, and source even the non-secret configs from another external source, making your deployable artifacts truly environment agnostic;
2) Use a library/framework like Spring Cloud Config to source down all configuration from another git repo. It behaves similarly in that when the app boots it requires a secret to establish a connection to a discovery service, that tells it the location of its configs, it then uses oauth2 to talk to a config service that feeds it its configs (including secrets crypted at rest and decrypted on the fly). This kind of thing might be a better approach w/ crafter as it appears you already use spring/java etc.
My answers are biased towards orchestrated and being cloud agnostic, but be adapted outside of containers.
Maybe crafter too tightly couples some of the configs that drive the underlying authoring/delivery engine itself (i,e. like the aws configs), from the raw end-user site content store itself. Might be good to keep this stuff totally separate to then can have diff security around stuff that might hold "secrets" (like this aws.xml) for example, vs raw end-user content that is under a different class of data.
Yes just having a syntax that indicates a value is encrypted is sufficient and leave it up to the operator to encrypt values put into XML configs (i.e. <value>secret:XXXXXXX</value>)